使用字符串调用PHP语言构造

时间:2011-04-08 15:54:15

标签: php buffer call language-construct

我想缓冲一些内容。获取内容的方式取决于,这就是为什么我在缓冲区函数中添加了一个类型参数来定义是包含还是回显源。

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

为什么?是不是可以通过字符串变量调用标准PHP函数(如echo()或include()?

修改:略微更改问题,使其更适合答案。

5 个答案:

答案 0 :(得分:6)

echo不是函数:它是一种语言构造 - 因此,它不能以这种方式调用。

你可能会定义一个函数,它本身会调用echo - 并在调用bufferContent时使用你的函数:

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


一个引用,引用the manual page of echo

  

注意:因为这是一种语言结构,而不是一种功能   无法使用variable functions

调用

答案 1 :(得分:2)

您不能从字符串变量调用echo,include,require_once,isset,empty,因为它们的行为与普通函数不同。 你可以使用

include "file.php";

include("file.php");

您可以创建一个包装函数并调用它们,如:

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

并做

$f = "wrap_echo";
$f("sth");

答案 2 :(得分:1)

会受到责骂,但你案件中的懒惰解决办法是:

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

适用于普通函数和语言结构。虽然你真的应该为特殊情况使用开关,并保持正常的变量函数调用其他所有。

答案 3 :(得分: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();
}

^你需要即兴发挥。这就是你做你需要做的事情!但是有更好,更有效/多样化的方法来做到这一点。

答案 4 :(得分: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

,我会立即看到您在做什么