闭包

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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值