类中的闭包和受保护的方法

时间:2016-02-03 17:45:01

标签: php closures

我不清楚以下是否有效:

class Sample {
    private $value = 10;

    public function something() {
        return function() {
            echo $this->value;
            $this->someProtectedMethod();
        }
    }

    protected function someProtectedMethod() {
        echo 'hello world';
    }
}

我使用的是PHP 5.6,运行的环境是5.6。我不确定两件事,这个范围。如果我可以在闭包函数中调用受保护的方法,私有方法和私有变量。

1 个答案:

答案 0 :(得分:1)

问题#1是一个简单的语法错误:

    return function() {
        echo $this->value;
        $this->someProtectedMethod();
    };

(注意分号)

现在,当您调用something()时,此代码将返回实际函数....它将不会执行该函数,因此您需要将该函数分配给变量。您必须将该变量的显式调用作为执行它的函数。

// Instantiate our Sample object
$x = new Sample();
// Call something() to return the closure, and assign that closure to $g
$g = $x->something();
// Execute $g
$g();

然后你会遇到范围问题,因为$this在调用$g时不在函数范围内。您需要将我们已实例化的Sample对象绑定到闭包以为$this提供范围,因此我们实际需要使用

// Instantiate our Sample object
$x = new Sample();
// Call something() to return the closure, and assign that closure to $g
$g = $x->something();
// Bind our instance $x to the closure $g, providing scope for $this inside the closure
$g = Closure::bind($g, $x)
// Execute $g
$g();

修改

Working Demo