假设这个类代码:
class Foo {
function method() {
echo 'works';
}
}
有没有办法存储对实例method
方法的引用?Foo
我只是在试验和摆弄,我的目标是检查 PHP 是否允许每次都$FooInstance->method()
无需编写即可调用。$FooInstance->
我知道我可以为此编写一个函数包装器,但我更感兴趣的是获取对实例方法的引用。
例如,这个伪代码理论上会存储$foo->method
在$method
变量中:
$foo = new Foo();
$method = $foo->method; //Undefined property: Foo::$method
$method();
显然,asmethod
是一种方法,我没有用()
解释器调用它认为我正在寻找一个属性,因此这不起作用。
我已通读Returning References,但这些示例仅显示如何返回对变量的引用,而不是方法。
因此,我调整了我的代码以将匿名函数存储在变量中并返回它:
class Foo {
function &method() {
$fn = function() {
echo 'works';
};
return $fn;
}
}
$foo = new Foo();
$method = &$foo->method();
$method();
这有效,但相当难看。此外,没有一种简洁的方式来调用它,因为这似乎需要在调用它之前将返回的函数存储在一个变量中:$foo->method()();
并且($foo->method())();
是语法错误。
此外,我尝试直接返回匿名函数而不将其存储在变量中,但随后我收到以下通知:
注意:只能通过引用返回变量引用
这是否意味着返回/存储对类实例方法的引用是不可能/不鼓励的,还是我忽略了什么?
更新:如有必要,我不介意添加 getter,目标只是获取对该方法的引用。我什至尝试过:
class Foo {
var $fn = function() {
echo 'works';
};
function &method() {
return $this->fn;
}
}
但是从unexpected 'function' (T_FUNCTION)
错误中我相信 PHP 明智地不允许属性存储函数。
我开始相信,如果不使用丑陋的 hack 作为eval()
.