2017-08-11 4 views
0

私は、学習の練習として、生成されたCSSを出力するCSSファイルとPHPファイルを結合して縮小する関数を作成しています。出力バッファリングを使用しているときに変数の競合を避ける方法

すべてがcssファイルをループしていますが、すぐに出力バッファから返された文字列をPHPファイルからプッシュしようとすると、配列はintになります。 var_dump()は次のようになります。

また、文字列を連結しようとしました。それはPHPファイルへのを得るまでには、その文字列の前のすべてがそうと同様に4となり、再び正常に動作します:

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

これは私がstyles.phpファイルでやっているものの例である:

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); 
    } 
} 

奇妙な部分が連結/ array_pushing時にエラーが実際にスローされていないです:

. . . 
.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; 
} 
. . . 

この 機能です。私は何がうまくいかないかを実際に理解することができないので、何を質問するのか正確にはわからない。また、ヘッダー、文字エンコーディング、さまざまなob関数、ob_get_flushを文字列にキャストして欲求不満から抜け出しました。

ソリューション:

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

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

その後にコードを変更?また、 '$ r [] = $ x'はここで' array_push() 'を使うよりも優れています。 – GentlemanMax

+0

@GentlemanMax私は$ r [count($ r)] = $ xでそれを試しました。それは同じ挙動をもたらした。私はちょうどvar_dump()とerror_log()を使用してループしながら値を取得しています。 私の疑念は、これが私が気づいていない出力バッファリングのいくつかの側面に由来しているということです。 – Taishi

+1

'array_push()'の直後に 'var_dump($ r)'をしていても、 'count($ r)'ビットは必要ありませんか?あなたは 'ob_get_clean()'で試しましたか? – GentlemanMax

答えて

0

私はあなたが変数$rを使用しているので、それが数字であなたの変数を上書きしています含めているPHPファイルを疑います。関数に文字列としてファイルを含める結果を取得するコードをラップすることで、変数の競合を避けることができます。これは、独自の変数スコープを持つためです。

あなたが投棄されている
 if ($fn['extension'] == 'php' || $fn['extension'] == 'css' ) 
     { 
      $x = get_include_contents($file); 
      array_push($r, $x); 
     } 
+0

これはおそらくそうです。私は、PHPがブロックレベルスコープを持っていないことに気付かなかった。私が月曜日にオフィスに戻ったときにこれを確認しなければならない。 これが原因である場合、出力バッファリングはスコープカプセル化を提供しないことを意味します。あれは正しいですか? – Taishi

+0

インクルードファイルの一般的な使い方の1つは、変数を設定することです。インクルードファイルがそれ自身のスコープ内にあれば、それはできません。 – Barmar

+0

私はちょうどPHPを学び始めたばかりなので、これは本当に便利な情報です。ありがとう。 – Taishi

関連する問題