php - 调用直接分配给对象属性的闭包

标签 php object properties closures

我希望能够直接调用我分配给对象属性的闭包,而无需将闭包重新分配给变量然后再调用它。这可能吗?

下面的代码不起作用并导致 fatal error :调用未定义的方法 stdClass::callback()

$obj = new stdClass();
$obj->callback = function() {
    print "HelloWorld!";
};
$obj->callback();

最佳答案

从 PHP7 开始,你可以这样做

$obj = new StdClass;
$obj->fn = function($arg) { return "Hello $arg"; };
echo ($obj->fn)('World');

或使用 Closure::call() ,尽管这不适用于 StdClass


在 PHP7 之前,您必须实现神奇的 __call 方法来拦截调用并调用回调(当然,这对于 StdClass 是不可能的,因为您无法添加 __call 方法)

class Foo
{
    public function __call($method, $args)
    {
        if(is_callable(array($this, $method))) {
            return call_user_func_array($this->$method, $args);
        }
        // else throw exception
    }
}

$foo = new Foo;
$foo->cb = function($who) { return "Hello $who"; };
echo $foo->cb('World');

注意你不能这样做

return call_user_func_array(array($this, $method), $args);

__call 主体中,因为这会触发无限循环中的 __call

关于php - 调用直接分配给对象属性的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28267375/

相关文章:

c# - 关于 Java "Properties"和 C#' Properties 之间的区别

javascript - 如何为 php 创建的 html 表运行点击事件

php - Elasticsearch查找子域

php - 我试图在 php 中创建一个循环,它会吐出下面的内容

javascript - 如果属性与另一个数组匹配,则检索数组中的对象

javascript - 如何将数组 [] 转换为一系列 { key : value } paired objects?

c# - 关键字 "new"对 C# 中的结构有何作用?

ios - 如果对象无效,如何检查 Swift?

C# 使用反射获取通用对象(及其嵌套对象)的属性

php - cron 作业和 PHP (Zend Framework) 入门