Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用bindTo_Php - Fatal编程技术网

如何在PHP中使用bindTo

如何在PHP中使用bindTo,php,Php,这并不完全是一个问题,但我发现了下面的一个例子,我不明白它是如何工作的,有人能解释一下吗 <?php class Number { private $v = 0; public function __construct($v) { $this->v = $v; } public function mul() { return function ($x) { return $th

这并不完全是一个问题,但我发现了下面的一个例子,我不明白它是如何工作的,有人能解释一下吗

<?php
class Number {
    private $v = 0;
    
    public function __construct($v) {
        $this->v = $v;
    }
    
    public function mul() {
        return function ($x) {
            return $this->v * $x; 
        };
    }
}

$one = new Number(1);
$two = new Number(2);
$double = $two->mul()->bindTo($one);
echo $double(5);

您问题中的示例比仅仅解释
bindTo
的工作原理要复杂一些。我想重点是您可以重新-bind
$this
,而不仅仅是将对象绑定到闭包,但我认为这可能会让一切变得更难理解

整个想法是,对于给定的闭包,您可以创建一个克隆,您已经为其设置了周围的作用域。最简单的例子如下():

123

请注意,在调用
bindTo
之前,类和函数是完全独立的。您的示例演示了即使是在类的实例中生成的闭包也可以反弹到不同的实例,但这可能不是最常见的用例

一个不同之处是,在现有类实例中生成的闭包将该类作为其作用域,因此将允许访问private+protected属性。如果您希望使用匿名函数从代码中的其他位置复制该函数,则需要使用
bindTo
的第二个参数来设置范围:

$closureThatShowsTheProperty = function() {
    echo $this->prop;
};

$objectThatHasTheProperty = new class() {
    private $prop = 123;
};

$closureThatShowsTheProperty->bindTo($objectThatHasTheProperty)();
致命错误:未捕获错误:无法访问私有属性

123

$closureThatShowsTheProperty = function() {
    echo $this->prop;
};

$objectThatHasTheProperty = new class() {
    private $prop = 123;
};

$closureThatShowsTheProperty->bindTo($objectThatHasTheProperty)();
$closureThatShowsTheProperty->bindTo($objectThatHasTheProperty, $objectThatHasTheProperty)();