Calling closure assigned to object property directly

前端 未结 12 2378
孤街浪徒
孤街浪徒 2020-11-22 14:02

I would like to be able to call a closure that I assign to an object\'s property directly without reassigning the closure to a variable and then calling it. Is this possible

12条回答
  •  我在风中等你
    2020-11-22 15:08

    As of PHP7, you can do

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

    or use Closure::call(), though that doesn't work on a StdClass.


    Before PHP7, you'd have to implement the magic __call method to intercept the call and invoke the callback (which is not possible for StdClass of course, because you cannot add the __call method)

    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');
    

    Note that you cannot do

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

    in the __call body, because this would trigger __call in an infinite loop.

提交回复
热议问题