PHP 闭包

PHP 闭包和匿名函数是同一个概念,是在 PHP5.3 引入的特性,现代 PHP 框架中广泛使用。
闭包是指在创建时封装状态的函数,也就是说即使闭包所在的环境不存在了,但是闭包中封装的状态值依然存在。
匿名函数是没有名称的函数,但可以赋值给变量,使用变量调用执行。
PHP 中闭包和匿名函数是同一个概念。

创建闭包

1
2
3
4
$fun = function($name) {
echo $name;
};
$fun('dev');

使用外部变量

闭包会调用外部的变量,这时使用关键字 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
28
class 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

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay