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

时间:2014-07-21 06:15:02

标签: php

是否可以在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()

3 个答案:

答案 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);

在课堂外调用你的闭包。