【问题标题】:PHP - force function evaluation?PHP - 强制函数评估?
【发布时间】:2015-08-02 05:02:23
【问题描述】:

我正在使用 PHP 5.3,来自 JS 和 Python 领域,不能使用 call() 因为

假设我有一个函数生成器,例如在 JS 土地上记录东西:

function console($meth){
    return function() use($meth) {
        print "<script>console.".$meth.".apply(console,".json_encode(func_get_args()).")</script>";
    };
}

我想动态评估这个,比如:

console($meth)($thing1,$thing2);

但是

//console('log')('hello'); //syntax error!

悲伤的泪水!但是,这行得通。

$func = console('log');
$func('hello');

为什么会这样?为什么为什么为什么?

另外,如何在不使用 eval 或分配给变量的情况下强制 console('log') 进行评估?

【问题讨论】:

  • 5.3 不支持函数解引用。
  • 这只是 PHP 解析器的一个限制,它不允许您在需要函数名的地方使用函数调用。在 5.4 之前,您也不能将函数调用用作数组,例如func(arg)[1] 不起作用。

标签: php function metaprogramming


【解决方案1】:

这将从 PHP 5.3 开始工作:

function console($a) {
    return function($b, $c) {
        echo $b, $c;
    };
}

$f = console("a");
$f("b", "c");

如果您需要链接调用,这将适用于所有 PHP 5 版本:

class Foo {

    public function call($b, $c) {
        echo $b, $c;
    }
}

function console($a) {
    return new Foo();
}

$f = console("a")->call("b", "c");

我建议在最近的版本中开始学习 PHP。 PHP 开发者在 5.4 及后续版本中添加了很多很酷的东西。

【讨论】:

  • 不幸的是,在 CTO 确定可以安全迁移之前,我被困在 5.3 的土地上。
【解决方案2】:

另一种解决方法如下:

    class App_Console {
        private static $methods = array(
            'log',
            'info',
            'warn',
            'dir',
            'time',
            'timeEnd',
            'trace',
            'error',
            'assert'
        );
        function __call($name,$args){
            if(in_array($name,self::$methods)){
                printf("<script>console.$name.apply(console,%s)</script>\n",json_encode($args));
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多