15

ob_start() ob_end_clean() ob_end_flush() に関する PHP マニュアルを確認しました。そして、私は主題について別の例を見てきました.とにかく私は例を修正しましたが、私はこの時点で混乱しています. これがスクリプトです。

ob_start();
echo "Hello x, ";

ob_start();
echo "Hello y, ";

ob_start();
echo "Hello z, ";

ob_start();
echo "Hello World";
$ob_2 = ob_get_contents();
ob_end_clean();

echo "Galaxy";
$ob_1 = ob_get_contents();
ob_end_clean();

echo " this is OB_1 : ".$ob_1;
echo "<br>  and this is OB_2  : ".$ob_2;

このスクリプトの出力は次のとおりです。

こんにちは x、こんにちは y、こちらは OB_1 : ハロー z、ギャラクシー

これは OB_2 です: Hello World

--------------------------------------------

なぜ出力がそうではないのですか?

これは OB_1 です: Hello x、Hello y、Hello z、Galaxy

これは OB_2 です: Hello World

そして、私が見逃したポイントは何ですか?

4

2 に答える 2

42

何が起こっているのかを説明するために、コードに注釈を付けます。すべての出力バッファは空に初期化されます。これが標準です。

ob_start(); // open output buffer 1
echo "Hello x, "; // echo appended to output buffer 1

ob_start(); // open output buffer 2
echo "Hello y, "; // echo appended output buffer 2

ob_start(); // open output buffer 3
echo "Hello z, "; // echo appended to output buffer 3

ob_start(); // open output buffer 4
echo "Hello World"; // echo appended output buffer 4
$ob_2 = ob_get_contents(); // get contents of output buffer 4
ob_end_clean(); // close and throw away contents of output buffer 4

echo "Galaxy"; // echo appended to output buffer 3
$ob_1 = ob_get_contents(); // get contents of output buffer 3
ob_end_clean(); // close and throw away contents of output buffer 3

// at this point, $ob_2 = "Hello World" and $ob_1 = "Hello z, Galaxy"
// output buffer 1 = "Hello x," and output buffer 2 = "Hello y,"

echo " this is OB_1 : ".$ob_1; // echo appended to output buffer 2

// output buffer 2 now looks like "Hello y,  this is OB_1 : Hello z, Galaxy" 

echo "<br>  and this is OB_2  : ".$ob_2; // echo appended to output buffer 2

// output buffer 2 now looks like:
//   "Hello y,  this is OB_1 : Hello z, Galaxy<br> and this is OB_2  : Hello World"

// output buffer 2 implicitly flushed by end of script
// output from buffer 2 captured by (appended to) output buffer 1
// output buffer 1 now looks like:
//   "Hello x, Hello y,  this is OB_1 : Hello z, Galaxy<br> and this is OB_2  : Hello World"
// output buffer 1 implicitly closed by end of script. This is when your output
// actually gets printed for this particular script.
于 2012-05-04T01:22:49.320 に答える
23

出力バッファはスタックのように機能します。1 つのバッファを作成して "Hello x," をエコーし​​、次に別のバッファを作成して "Hello y" をエコーし​​、次に 3 つ目のバッファを作成して "Hello z," をエコーし​​ます。"Hello World" は 4 番目のバッファーに入り、 の呼び出しによって閉じられるob_end_clean()ため、3 番目のバッファーに戻ります。"Galaxy" をエコーし​​た後に呼び出すとob_get_contents()、その 3 番目のバッファーの内容が取得されます。

このコードの最後で再度呼び出すとob_get_contents()、2 番目のバッファーにある "Hello y" が返されます。そしてob_end_close()、それをob_get_contents()もう一度行うと、最初のバッファから "Hello x," が返されます。

于 2012-05-04T01:18:20.883 に答える