PHP关闭类实例

时间:2013-12-13 22:34:55

标签: php oop closures anonymous-function

如果我有一个类:

class MyClass
{
   public function foo() 
   {
      echo "foo";
   }
}

然后在类之外实例化它并尝试在其中创建一个匿名函数:

$mine = new MyClass();

$mine->bar = function() {
   echo "bar";
}

然后尝试将其称为$mine->bar(),我得到:

  

致命错误:在...中调用未定义的方法MyClass :: bar()

如何在类实例上创建匿名函数/闭包?

除此之外:在你告诉我之前我应该​​重新考虑我的逻辑或正确使用接口和OOP,在我的情况下,这是一个方便的方法,适用于这个特定的实体类的实例,试图清理一个遗留程序申请。是的,我正在使用PHP 5.3 +

3 个答案:

答案 0 :(得分:3)

请在此处查看我的博客文章:http://blog.flowl.info/2013/php-container-class-anonymous-function-lambda-support/

您需要添加一个神奇的__call功能:

public function __call($func, $args) {
    return call_user_func($this->$func, $args);
}

问题是,在此构造中,您可以从公共范围调用私有方法。 我建议简单地将新变量添加到未定义的类中。您可以使用magic __set函数和 catch 容器中的所有未定义变量(=数组,如我的博文中)来避免这种情况,并将call_user_func行为更改为仅在数组内调用:< / p>

// inside class:
public $members = array();

public function __call($func, $args) {
    // note the difference of calling only inside members:
    return call_user_func($this->members[$func], $args);
}

答案 1 :(得分:1)

<强> __呼叫

这样可行。

class Foo {

    public $bar;
    public function __construct()
    {
        $this->bar = function()
        {
            echo 'closure called';
        };

        $this->bar();
    }

    public function __call($method, $args) {
        return call_user_func($this->$method, $args);
    }

}

new Foo();

答案 2 :(得分:1)

正在创建函数IS。 PHP在调用它时遇到问题。

很脏,但有效:

$f = $mine->bar;
$f();