[英]What is Closure::bind() in PHP
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”关键字,这让我更加困惑。
如果将$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()
运行时, $this
为NULL
并且它会触发错误( “PHP致命错误:在不在对象上下文中时使用$this
” )。
Closure::bindTo()
创建一个新的闭包,但它将这个新闭包内的$this
的值“绑定”到它接收的对象作为其第一个参数。
在$cl3
存储的代码中, $this
与全局变量$x
具有相同的值。 当$cl3()
运行时, $this->ifoo
是对象$x
中ifoo
的值。
Closure::bind()
是Closure::bindTo()
的静态版本。 它与Closure::bindTo()
具有相同的行为,但需要一个额外的参数:第一个参数必须是要绑定的闭包。
如果您更喜欢使用静态版本,请尝试
$cl4 = Closure::bind(function () { return $this->ifoo; }, new A(), 'A');
echo $cl4();
// it returns "2"
如果你想更新一个对象的属性,它很酷,但是没有'setter'属性。 例如:
class Product {
private $name;
private $local;
public function __construct(string $name) {
$this->name = $name;
$this->local = 'usa':
}
}
$product1 = new Product('nice product');
echo $product1->local;
// it returns 'usa'
$product2 = \Closure::bind(function () {
$this->local = 'germany';
return $this;
}, new Product('nice product'), 'Product');
echo $product2->local;
// it returns 'germany'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.