2017-08-11 3 views
0

J'écris une fonction, en tant qu'exercice d'apprentissage, pour combiner et réduire les fichiers css et les fichiers php qui génèrent des css générés.Comment éviter les conflits de variables lors de l'utilisation de tampons de sortie

Tout va bien dans les fichiers css mais dès qu'il essaie de pousser la chaîne renvoyée par le tampon de sortie du fichier php, le tableau devient un int. var_dump() donne ceci:

int(5) 

J'ai également essayé de concaténer les chaînes; il fonctionne bien à nouveau jusqu'à ce qu'il get dans le fichier php, puis tout précédent dans la chaîne devient 4. Comme si:

4/* 
* Home: Appointment Grid 
*/ 
.difAppointmentGrid { 
    margin: 2rem 0; 
    font-family: "Lato" !important; 
    box-shadow: -4px 4px 16px 4px hsla(240, 0%, 0%, 0.1); 
} 
. . . 

Voici un exemple de ce que je fais dans le fichier styles.php:

. . . 
.difAppointmentGrid header div h3 { 
    margin: 0; 
    padding: 1.5rem 0; 
    font-size: 2rem; 
    text-align: center; 
    color: white; 
} 
<?php 
for ($h3 = 1, $o = 0.40; $h3 <= 4; ++$h3, $o += 0.20) 
{ 
    $rule = '.difAppointmentGrid header div:nth-child('.$h3.') h3 {'."\n\t". 
      'background-color: hsla(223, 63%, 22%, '.$o.');'."\n". 
      '}'."\n"; 
    echo $rule; 
} 
?> 
.dif_grid { 
    display: flex; 
} 
. . . 

C'est la fonction:

function styles_init() 
{ 
    $path = __DIR__ . '/aggregate.min.css'; 
    if (is_writable($path)) 
    { 
     $r = array(); 
     foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file) 
     { 
      $fn = pathinfo($file); 
      if ($fn['extension'] == 'php' || $fn['extension'] == 'css' ) 
      { 
       ob_start(); 
       include($file); 
       $x = ob_get_flush(); 
       $r[] = $x; 
      } 
     } 
     $c = implode("\n\n", $r); 
     //$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c))); 

     $f = fopen($path, 'wb'); 
     fwrite($f, $c); 
     fclose($f); 
    } 
} 

la partie la plus bizarre est pas d'erreur sont effectivement jetés quand array_pushing/concaténer. Je ne sais même pas exactement quelle question poser parce que je n'arrive pas à comprendre ce qui ne va pas. Je me suis aussi amusé avec les en-têtes, l'encodage de caractères, les différentes fonctions d'ob, et le lancement de ob_get_flush pour enchaîner le désespoir.

Solution:

function get_include_output($file) 
{ 
    ob_start(); 
    include($file); 
    return ob_get_flush(); 
} 
function styles_init() 
{ 
    $path = __DIR__ . '/aggregate.min.css'; 
    if (is_writable($path)) 
    { 
     $r = array(); 
     foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file) 
     { 
      $fn = pathinfo($file); 
      if ($fn['extension'] == 'php' || $fn['extension'] == 'css' ) 
      { 
       $r[] = get_include_contents($file); 
      } 
     } 
     $c = implode("\n\n", $r); 
     //$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c))); 

     $f = fopen($path, 'wb'); 
     fwrite($f, $c); 
     fclose($f); 
    } 
} 
+0

Où le dumping vous? Aussi '$ r [] = $ x' est mieux que d'utiliser' array_push() 'ici. – GentlemanMax

+0

@GentlemanMax Je viens de l'essayer avec $ r [count ($ r)] = $ x; et il en résulte le même comportement. Je viens d'utiliser var_dump() et error_log() pour obtenir les valeurs lors de la boucle. Mon soupçon est que cela provient d'un aspect de la mise en mémoire tampon de sortie que je ne connais pas. – Taishi

+1

Vous n'avez pas besoin du bit 'count ($ r)', quoi qu'il en soit, vous faites 'var_dump ($ r)' juste après 'array_push()'? Avez-vous essayé avec 'ob_get_clean()'? – GentlemanMax

Répondre

0

Je soupçonne que le fichier PHP que vous incluez utilise la $r variables, il est donc votre variable d'écraser un nombre. Vous pouvez éviter les conflits de variables en enveloppant le code qui obtient le résultat de l'inclusion du fichier en tant que chaîne dans une fonction, car cela aura sa propre portée variable.

function get_include_output($file) { 
    ob_start(); 
    include($file); 
    return ob_get_flush(); 
} 

changer ensuite votre code:

 if ($fn['extension'] == 'php' || $fn['extension'] == 'css' ) 
     { 
      $x = get_include_contents($file); 
      array_push($r, $x); 
     } 
+0

Cela semble probable; Je n'ai pas réalisé que php n'a pas de portée au niveau du bloc. Je vais devoir vérifier cela quand je serai de retour au bureau lundi. Si cela est la cause, cela implique que la mise en mémoire tampon de sortie ne fournit pas d'encapsulation de portée. Est-ce exact? – Taishi

+0

Rappelez-vous que l'une des utilisations courantes des fichiers include est de définir des variables. Si le fichier include était dans sa propre portée, il ne pouvait pas le faire. – Barmar

+0

Je viens tout juste d'apprendre PHP, donc toutes ces informations sont vraiment utiles. Merci. – Taishi