是否可以在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()
答案 0 :(得分:2)
尝试像
一样打电话$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();
答案 1 :(得分:1)
真正的问题是:是,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']
的传递有很大不同(显然在这里工作了很多) - 因为你的属性包含一个回调,但 class 包含这样的方法。当然,您也可以使用call_user_func()
。
至于语法支持,Nikita Popov提出了an RFC,它将允许您仅使用语法解决问题 - 因此不需要额外的函数调用(幸运的是,RFC已被接受并且有真正的机会在较新的PHP版本中实现。)
答案 2 :(得分:0)
您必须使用call_user_func()
或call_user_func_array()
来呼叫您的关闭。
所以你可以做到以下几点:
$testing = new testing();
echo call_user_func($testing->testvars);
在课堂外调用你的闭包。