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/4535330/

相关文章:

php - 如何使用一个sql查询创建多个表

php - Yii 小数范围的验证规则

javascript - Codeigniter Ajax 后显示 404

php - CI_SESSION 查询所需的 ID 以查找事件用户

javascript - 有没有更好的方法从 JSON 对象获取特定值?

php - 在 PHP 中将对象和整数相加的语义?

c++ - OOP风格问题

swift - 创建 Swift 属性

java - spring中的多个属性文件

javascript - "reset"对象的属性顺序如何? JSON.stringify() 保留它们