是否可以像这样在PHP对象的属性中存储函数:
class testing {
public $testvars;
function __construct(){
$this->testvars = function(){
return "Test String";
};
}
}
如果有可能,你怎么称呼它?
我一直试着这样称呼它:
$main = new testing();
$main->testvars();
但是会抛出错误:
Fatal error: Call to undefined method testing::testvars()
尝试调用
$this->testvars();
考虑到你在同一个类中调用这个函数。如果你在另一个类中调用它你需要添加这个_call()
函数
public function __call($method, $args) {
if(isset($this->$method) && is_callable($this->$method)) {
return call_user_func_array(
$this->$method,
$args
);
}
}
到你的新类中,你可以把它命名为
$main->testvars();
真正的问题是:是, PHP语法缺乏对这种情况的支持。{..}
和(..)
都不能帮助你。访问该属性(没有__call()
魔法)的唯一方法是:
class testing {
public $testvars;
function __construct(){
$this->testvars = function(){
return "Test String";
};
}
}
$obj = new testing();
echo call_user_func_array($obj->testvars, []);
所以传递回调到call_user_func_array()
。请注意传递[$obj, 'testvars']
的巨大差异(显然这里不起作用)—因为属性包含回调,但类不包含这样的方法。当然,您也可以使用call_user_func()
。
关于语法支持,有一个由Nikita Popov提出的RFC,它将允许您仅用语法解决问题-因此不需要额外的函数调用(幸运的是,RFC被接受并且有真正的机会在较新的PHP版本中实现)。
您必须使用call_user_func()
或call_user_func_array()
调用闭包。
所以你可以这样做:
$testing = new testing();
echo call_user_func($testing->testvars);
在类本身之外调用闭包