これがバグなのか機能なのかはわかりません。PHP のソース コードを見るとob_get_clean
、コールバックが呼び出される前に の戻り値が満たされていることがわかりました。
少なくとも 2 つの回避策があります。1 つ目は、出力文字列に対して自分でコールバックを手動で呼び出すことです。これは例えがいらないと思います。
2 つ目は、出力バッファリングをスタックする可能性を利用することです。フラッシュはコールバックを正常に使用するため、出力コードを追加の出力バッファー内にラップして、変更された内容を取得できます。
ob_start();
function callback($input) { return $input . " altered"; }
ob_start('callback');
echo "foo";
ob_end_flush();
$content = ob_get_clean();
ob_end_clean();
echo $content . "\n"; // prints "foo altered\n"
ob_get_clean
興味がある場合は、(main/output.c)のソース コードを参照してください。ソース コードは、PHP の Web サイトで入手できます。ここにいくつかの指針があります。
/* {{{ proto bool ob_get_clean(void)
Get current buffer contents and delete current output buffer */
PHP_FUNCTION(ob_get_clean)
{
if (zend_parse_parameters_none() == FAILURE) {
return;
}
// THIS CALL FILLS THE RETURN VALUE
if (php_ob_get_buffer(return_value TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
if (!OG(ob_nesting_level)) {
php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer. No buffer to delete");
zval_dtor(return_value);
RETURN_FALSE;
}
if (OG(ob_nesting_level) && !OG(active_ob_buffer).status && !OG(active_ob_buffer).erase) {
php_error_docref("ref.outcontrol" TSRMLS_CC, E_NOTICE, "failed to delete buffer %s", OG(active_ob_buffer).handler_name);
zval_dtor(return_value);
RETURN_FALSE;
}
// THIS CALL KILLS THE CURRENT BUFFER AND EXECUTES THE CALLBACK
php_end_ob_buffer(0, 0 TSRMLS_CC);
}
/* }}} */
php_end_ob_buffer
OB バッファの内容を取得し、それにコールバックを適用します。最初のパラメーターが true の場合、内容を次の出力バッファリング ハンドラーに渡します。この場合は false であるため、コールバックを実行してもコンテンツは失われます。