2

一部のコンテンツをバッファリングしたい。コンテンツがどのようにフェッチされるかは依存するため、ソースを含めるかエコーするかを定義するために、型パラメーターをバッファー関数に追加しました。

PHP

<?php

function bufferContent($source, $type = 'include') {
  ob_start();
  $type($source);
  return ob_get_clean();
}

echo bufferContent('<html>test</html>', 'echo');

?>

出力

Fatal error: Call to undefined function echo() in #### on line 5

なぜですか?文字列変数で、echo() や include() のような標準的な PHP 関数を呼び出すことはできませんか?

編集:回答により適したものにするために、質問をわずかに変更しました。

4

5 に答える 5

6

echoは関数ではありません: これは言語構造です。したがって、この方法で呼び出すことはできません。

可能性としては、それ自体が echo を呼び出す関数を定義し、呼び出し時に関数を使用することが考えられますbufferContent

function my_echo($str) {
    echo $str;
}
echo bufferContent('<html>test</html>', 'my_echo');


のマニュアルページをecho 引用したリファレンス:

注:これは関数ではなく言語構造であるため、変数関数を使用して呼び出すことはできません。

于 2011-04-08T15:56:54.150 に答える
2

通常の関数のように動作しないため、文字列変数から echo、include、require_once、isset、empty を呼び出すことはできません。使用できます

include "file.php";

include("file.php");

ラッパー関数を作成して、代わりに次のように呼び出すことができます。

function wrap_echo($str) { echo($str); };

そして、やります

$f = "wrap_echo";
$f("sth");
于 2011-04-08T15:58:15.097 に答える
1

そのために叱られるつもりですが、あなたの場合の怠惰な回避策は次のようになります:

eval(" $type(\$source); ");

これは、通常の関数と言語構造で機能します。ただし、特別な場合にはスイッチを使用する必要があり、それ以外の場合は通常の可変関数呼び出しを維持する必要があります。

于 2011-04-08T16:02:06.853 に答える
1
function buffer_content($source, $type = 'echo') {
    if(!is_string($type)){
        trigger_error('$type must be a string.', E_USER_WARNING);
        return false;
    }
    if(is_object($source) and method_exists($source, '__toString')){
        $source = strval($source);
    }elseif(is_scalar($source)){
        $source = strval($source);
    }elseif(!is_string($source)){
        trigger_error('$source must be a string as non-scalars do not echo nicely.', E_USER_WARNING);
        return false;
    }
    ob_start();
    switch(strtolower($type)){
        case 'include': include $source; break;
        case 'include_once': include_once $source; break;
        case 'require': require $source; break;
        case 'require_once': require_once $source; break;
        case 'echo': echo $source; break;
        default: trigger_error("\$type '{$type}' is not supported.", E_USER_WARNING); break;
    }
    return ob_get_clean();
}

^ 少し即興する必要があります。これは、あなたがしなければならないことをする方法です!しかし、それを行うためのより優れた、より効率的で汎用性の高い方法があります。

于 2012-10-29T15:29:57.990 に答える
0

echo実際には関数ではなく、PHP 内の言語構造であるため、関数として呼び出すことはできません。

を効果的に呼び出すためにecho、次のようなラッパー メソッドを作成できます。

function call_echo($str){
  echo $str;
}

私が使用する文字列を介して関数を呼び出すトピックについてcall_user_func

mixed call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )

だからあなたの場合はそうなるでしょう

call_user_func($type, $source);

call_user_func変数関数の方が読みやすく、混乱が少ないため、変数関数よりも選択します。私があなたのコードを読んでいたら、あなたが何をしていたかすぐにわかります。call_user_func

于 2011-04-08T15:59:21.823 に答える