闭包

来源:互联网 发布:雅马哈电子琴入门 知乎 编辑:程序博客网 时间:2024/06/12 04:04
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。
原创粉丝点击