关于PHP的闭包(Closure类)
一:概念:这段话摘自手册:
匿名函数(在 PHP 5.3 中被引入)会产生这个类型的对象。在过去,这个类被认为是一个实现细节,但现在可以依赖它做一些事情。自 PHP 5.4 起,这个类带有一些方法,允许在匿名函数创建后对其进行更多的控制。
除了此处列出的方法,还有一个 __invoke 方法。这是为了与其他实现了 __invoke()魔术方法 的对象保持一致性,但调用匿名函数的过程与它无关。
二:类摘要,摘自手册:
Closure { /* 方法 */ __construct ( void ) public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] ) }
- Closure::__construct — 用于禁止实例化的构造函数
- Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。
- Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域。
bind(静态闭包)有三个参数:Closure:匿名函数;newthis:绑定匿名函数的对象;newscope:闭包类的作用域
bindTo 和上面差不多,后面举例说明。
这段话看起来有些绕,不太好理解,实际举几个例子说明下!
三实例:
1:bind绑定$this对象和作用域
<?php class A { public $str = 'My is A'; } class B { private $str = 'My is B'; } $ab = function () { //匿名函数 返回A类或B类的参数 return $this->str; //这里有个this }; $a = Closure::bind($ab, new A); //绑定或者叫注册A类,一个意思 new A对象绑定到匿名函数中 echo $a();//My is A
这里绑定了A类,A类只绑定了对象。
B类怎么绑定?
$b = Closure::bind($f, new B,'B'); //注册B类 echo $b();//My is B
B类同时绑定了对象和作用域,可以看到B类绑定的时候多了一个参数B,对照上面,B是什么?作用域,因为上面B类做的方法是private,如果不加这个,就会提示无法访问私有属性。
2:bind只绑定作用域
<?php class B { static private $str = 'My is B'; } $ab = function () { //匿名函数 返回A类或B类的参数 return self::$str; //这里有个this }; $person = new B(); $b = Closure::bind($ab, NULL,B::class); //注册B类 echo $b();//My is BB类如果要用$this,必须传入第二个参数:$this对象。