是否可以将函数存储在PHP对象的属性中?


Is it possible to store a function in PHP object's properties?

是否可以像这样在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);

在类本身之外调用闭包