PHP 中的闭包和匿名函数是同一个概念,是在 PHP5.3 引入的特性,现代 PHP 框架中广泛使用。
闭包是指在创建时封装状态的函数,也就是说即使闭包所在的环境不存在了,但是闭包中封装的状态值依然存在。
匿名函数是没有名称的函数,但可以赋值给变量,使用变量调用执行。
在 PHP 中闭包和匿名函数是同一个概念。
创建闭包
$fun = function($name) {
echo $name;
};
$fun("dev");
使用外部变量
闭包会调用外部的变量,这时使用关键字 use 传递外部变量。
$name = "top";
$fun = function($value) use ($name) {
echo $value, PHP_EOL;
echo $name, PHP_EOL;
};
$fun("val");
PHP 回调函数
在 PHP 中的许多内建函数中,都会使用到回调函数,这时可以使用匿名函数比较方便。
$arr = [1, 2, 3];
$res = array_map(function ($val) {
return $val + 1;
}, $arr);
print_r($res);
bindTo
上面说了闭包都是继承 Closure,那么也就说他也是一个类,那么 $this 也是指向实例自己,在闭包中可以使用 bindTo 修改这个指向,让 $this 指向其他的对象,这样 $this 可以访问其他对象的属性和方法。
具体用法:
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");
附加说明:
上面介绍的时候说了这句话:
闭包是指在创建时封装状态的函数,也就是说即使闭包所在的环境不存在了,但是闭包中封装的状态值依然存在。
那么举个栗子说明:
$name = "aa";
// 将变量 $name 封装到闭包内
$fun = function() use ($name) {
echo "fun" . $name;
};
$name = "bb";
// funaa
$fun();
unset($name);
// 虽然已经释放掉 $name,但是 $fun 还是可以调用成功
// funaa
$fun();
从上面例子中可以清楚的感受到闭包在创建的时候封装了外部变量,这个状态就在闭包状态中一直存在,及时变量改变或者释放,都不会影响。
在 PHP 中匿名函数可以赋值给变量,可以调用,说到底 PHP 的匿名函数都是继承了 Closure 类,在调用的时候会触发魔术方法 __invoke。
闭包
最新推荐文章于 2023-10-08 22:46:29 发布