微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 根据类定义一个闭包作为方法

我试图玩PHP5.3和关闭.

在这里看到(清单7中的对象关闭http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html)可以在回调函数中使用$this,但不是.所以我试图给$$作为使用变量:

$self = $this;
$foo = function() use($self) { //do something with $self }

所以要用同样的例子:

class Dog
{
private $_name;
protected $_color;

public function __construct($name,$color)
{
     $this->_name = $name;
     $this->_color = $color;
}
public function greet($greeting)
{
     $self = $this;
     return function() use ($greeting,$self) {
         echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
     };
}
}

$dog = new Dog("Rover","red");
$dog->greet("Hello");

Output:
Hello,I am a red dog named Rover.

首先这个例子不打印字符串但是返回函数,但这不是我的问题.

其次,我无法访问私有或受保护,因为回调函数一个全局函数,而不是在上下文中从Dog对象.不是我的问题与以下相同:

function greet($greeting,$object) {
    echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
}

而且我要 :

public function greet($greeting) {
    echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
}

哪个来自狗而不是全球.

嗯,你不能使用$this的全部原因是因为闭包是后台的对象(Closure类).

这有两种方法.首先,添加__invoke方法(如果调用$obj(),调用)..

class Dog {

    public function __invoke($method) {
        $args = func_get_args();
        array_shift($args); //get rid of the method name
        if (is_callable(array($this,$method))) {
            return call_user_func_array(array($this,$method),$args);
        } else {
            throw new BadMethodCallException('UnkNown method: '.$method);
        }
    }

    public function greet($greeting) {
        $self = $this;
        return function() use ($greeting,$self) {
            $self('do_greet',$greeting);
        };
    }

    protected function do_greet($greeting) {
        echo "$greeting,I am a {$this->_color} dog named {$this->_name}.";
    }
}

如果您想要修改主机对象时关闭不变,您可以将返回函数更改为:

public function greet($greeting) {
    $self = (clone) $this;
    return function() use ($greeting,$self) {
        $self('do_greet',$greeting);
    };
}

一个选择是提供一个通用的getter:

class Dog {

    public function __get($name) {
        return isset($this->$name) ? $this->$name : null;
    }

}

有关更多信息,请参阅:http://www.php.net/manual/en/language.oop5.magic.php

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐