PHP中的闭包-Closure

类摘要

1
2
3
4
5
6
Closure {
/* 方法 */
__construct ( void ) //用于禁止实例化的构造函数
public static bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) : Closure //复制一个闭包,绑定指定的$this对象和类作用域
public bindTo ( object $newthis [, mixed $newscope = 'static' ] ) : Closure //复制当前闭包对象,绑定指定的$this对象和类作用域
}

匿名函数尝试

1
2
3
4
5
6
7
8
9
10
11
12
$say = function(){
echo 'hello Closure';
};
$say(); //输出 "hello Closure"

function say()
{
return function ($str) {
echo $str;
};
}
say()('hello Closure');

bind摘要

1
2
3
4
5
6
7
8
9
10
11
/**
closure
需要绑定的匿名函数。

newthis
需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。

newscope
想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。
**/
public static Closure::bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) : Closure

bind 实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Luci
{
private $name = 'Luci';
protected $age = '30';
private static $weight = '70kg';
public $address = '中国';
public static $height = '180cm';
}

//name为私有,未绑定类作用域情况下无法调用私有属性,会报错
$fun1 = Closure::bind(function (){
return $this->name;
},new Luci());
echo $fun1();
//
$func1 = Closure::bind(function (){
return $this->name;
},new Luci(),'Luci');
echo $func1();

//同上age为protected,会报错
$fun2 = Closure::bind(function (){
return $this->age;
},new Luci());

echo $fun2();

$fun3 = Closure::bind(function (){
return Luci::$height;
},null);
echo $fun3();

$fun3 = Closure::bind(function (){
return Luci::$weight;
},new Luci(),'Luci');
echo $fun3();

总结

  • 第一个参数:closure 必须有
  • 第二个参数:newthis,匿名函数中以$this->name方式访问属性时必须填写第二个参数,填写要绑定对象的实例,类名:属性名方式访问时,第二个参数可以写为null
  • 第三个参数:newscope 如果访问的属性是public情况下可以不用填写,如果是protected,private情况下,第三个参数必填