什么是PHP中的Closure :: bind()

时间:2017-09-15 14:23:58

标签: php closures

PHP手册对Closure::bind()提供的解释很少,而且这个例子也让人感到困惑。

以下是网站上的代码示例:

class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};

$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "\n";
echo $bcl2(), "\n";

Closure :: bind()的参数是什么?

上面使用了Null,甚至也使用了“new”关键字,这让我更加困惑。

2 个答案:

答案 0 :(得分:4)

如果您将$cl2的值作为类A的方法,则该类看起来像这样:

class A {
    public $ifoo = 2;

    function cl2()
    {
        return $this->ifoo;
    }
}

你可以像这样使用它:

$x = new A();
$x->cl2();
# it prints
2

但是,因为$cl2是一个闭包而不是类A的成员,所以上面的用法代码不起作用。

方法Closure::bindTo()允许使用闭包,因为它是类A的方法:

$cl2 = function() {
    return $this->ifoo;
};

$x = new A();
$cl3 = $cl2->bindTo($x);
echo $cl3();
# it prints 2

$x->ifoo = 4;
echo $cl3();
# it prints 4 now

闭包使用$this的值,但$this中未定义$cl2。 当$cl2()运行时,$thisNULL并且会触发错误(" PHP致命错误:当不在对象上下文中时使用$this" )。

Closure::bindTo()会创建一个新的闭包,但它会绑定"这个新闭包中$this的值是它作为第一个参数接收的对象。

$cl3中存储的代码中,$this与全局变量$x具有相同的值。运行$cl3()时,$this->ifoo是对象ifoo$x的值。

Closure::bind()Closure::bindTo()的静态版本。它与Closure::bindTo()具有相同的行为,但需要一个额外的参数:第一个参数必须是要绑定的闭包。

答案 1 :(得分:0)

如果您希望使用静态版本,只需尝试

xlRange := xlWorksheet.Range('E:E');
xlRange.NumberFormat := '#.##0,00 €;[Red]-#.##0,00 €';
For RowIndex := 1 to 10 DO BEGIN
  xlRange := xlWorksheet.Range('E'+ RowIndex);
  xlRange.Value2 := SomeDecimalValue
END

如果您想更新对象的属性,这很酷,但是该属性没有“设置者”。例如:

$cl4 = Closure::bind(function () { return $this->ifoo; }, new A(), 'A');
echo $cl4();
// it returns "2"