Это интересный вопрос. Это работает:
$a = new stdClass;
$a->foo = function() { echo "bar"; };
$b = $a->foo;
$b(); // echos bars
но, как вы говорите, это не так:
$a = new stdClass;
$a->foo = function() { echo "bar"; };
$a->foo();
Если вам нужен объект, к которому вы можете динамически вызывать членов, попробуйте:
class A {
public function __call($func, $args) {
$f = $this->$func;
if (is_callable($f)) {
return call_user_func_array($f, $args);
}
}
}
$a = new A;
$a->foo = function() { echo "bar\n"; };
$a->foo2 = function($args) { print_r($args); };
$a->foo();
$a->foo2(array(1 => 2, 3 => 4));
Но вы не можете заменить вызываемые методы таким образом, потому что __call()
вызывается только для методов, которые либо не существуют, либо недоступны (например, они закрыты).