PHP 闭包和匿名函数是同一个概念,是在 PHP5.3
引入的特性,现代 PHP
框架中广泛使用。
闭包是指在创建时封装状态的函数,也就是说即使闭包所在的环境不存在了,但是闭包中封装的状态值依然存在。
匿名函数是没有名称的函数,但可以赋值给变量,使用变量调用执行。
在 PHP
中闭包和匿名函数是同一个概念。
创建闭包
1 | $fun = function($name) { |
使用外部变量
闭包会调用外部的变量,这时使用关键字 use
传递外部变量。1
2
3
4
5
6$name = 'top';
$fun = function($val) use ($name) {
echo $val, PHP_EOL;
echo $name, PHP_EOL;
};
$fun('val');
PHP 回调函数
在 PHP
中的许多内建函数中,都会使用到回调函数,这时可以使用匿名函数比较方便。1
2
3
4
5$arr = [1, 2, 3];
$res = array_map(function($val) {
return $val + 1;
}, $arr);
print_r($res);
bindTo
上面说了闭包都是继承 Closure
,那么也就说他也是一个类,那么 $this
也是指向实例自己,在闭包中可以使用 bindTo
修改这个指向,让 $this
指向其他的对象,这样 $this
可以访问其他对象的属性和方法。
具体用法: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
28class App
{
private $name = 'New App';
public $version = '1.1';
public $data = [];
public function bind($name, $callback)
{
// 将 __CLASS__ 绑定到 closure 的 $this 上
$this->data[$name] = $callback->bindTo($this, __CLASS__);
}
public function run($name)
{
$this->data[$name]();
}
}
$app = new App();
$app->bind('dev', function() {
// 这里的 $this 指向了 App
echo $this->name;
});
$app->run('dev');
附加说明:
上面介绍的时候说了这句话:
闭包是指在创建时封装状态的函数,也就是说即使闭包所在的环境不存在了,但是闭包中封装的状态值依然存在。
那么举个栗子说明:1
2
3
4
5
6
7
8
9
10
11
12$name = 'aa';
// 将变量 $name 封装到闭包内
$fun = function() use ($name)
{
echo 'fun' . $name;
};
$name = 'bb';
$fun(); // funaa
unset($name); // 虽然已经释放掉 $name,但是 $fun 还是可以调用成功
$fun(); // funaa
从上面例子中可以清楚的感受到闭包在创建的时候封装了外部变量,这个状态就在闭包状态中一直存在,及时变量改变或者释放,都不会影响。
在 PHP
中匿名函数可以赋值给变量,可以调用,说到底 PHP
的匿名函数都是继承了 Closure
类,在调用的时候会触发魔术方法 __invoke
。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End