【web 开发基础】PHP的匿名函数和闭包 (40)

举报
迷彩 发表于 2023/07/03 20:38:13 2023/07/03
【摘要】 前言PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包其实可以简单地理解为是伪装成函数的对象。什么是匿名函数匿名函数:就是没有名称的函数,匿名函数可以赋值给变量、对象传递。不过匿名函数仍是函数,也就是本质是还是函数,因此可以进行调用,还可以传入参数。匿名函数特别适合作为函数或方法的回调。回调我们前面介绍过,可以通过《【web 开发基础】PHP 自定义回调函数之 call_user_...

前言

PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包其实可以简单地理解为是伪装成函数的对象。

什么是匿名函数


匿名函数:就是没有名称的函数,匿名函数可以赋值给变量、对象传递。不过匿名函数仍是函数,也就是本质是还是函数,因此可以进行调用,还可以传入参数。匿名函数特别适合作为函数或方法的回调。回调我们前面介绍过,可以通过《【web 开发基础】PHP 自定义回调函数之 call_user_func_array() (36)》这篇文章了解。

什么是闭包

简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。MDN 上面的说法:闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。简单理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使得我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。

闭包:是指在创建时封装周围状态的函数。即使闭包所在的环境不存在了,闭包中封装的状态依然存在。

注:理论上讲,闭包和匿名函数是不同的概念. 只是在PHP中将两者视作相同的概念。


PHP中的匿名函数和闭包

匿名函数

匿名函数与普通函数的区别:

(1)随用随建,省去定义的过程,代码变得更加简洁

(2)省去了普通函数命名的过程


PHP支持回调函数(callback),和其他高级语言相比是增分比较多的一项功能,但和JavaScript相比,PHP5.3以前的回调函数使用并不是很灵活,只有“字符串的函数名”和“使用create_function的返回值”两种选择。而在PHP5.3以后,我们又多了一个选择——匿名函数(Anonymous functions),也叫闭包(closures),它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值。当然,也有其他应用的情况。匿名函数的语法如下:

$func = function(){
    
};//带结束符,相当于一句完整的表达式

下面我们通过一段代码简单了解匿名函数的使用:

<?php
$func = function($param){
     echo($param);
};
$func("你好");

执行结果:

匿名函数也可以作为一个变量的值来使用,可以直接将匿名函数作为参数传给回调函数,是匿名函数最常见的用法,匿名函数时一句表达式,一定不要忘了加上分号“;”。还可以在函数中定义一个匿名函数:

<?php
//函数里定义一个匿名函数,并且调用它
function demo(){
    $func = function($param){
        echo $param;
    };
    $func('你好');
}
demo();

执行结果:


调用回调函数时将匿名函数作为参数的代码如下:

<?php
//将匿名函数作为参数传递
function func($callback){
    $callback();
}

$val = "你好";
func(function() use (&$val){
	echo "闭包函数传入的参数为:". $val;
});

执行结果:

通过函数还可以把匿名函数返回:

<?php
// 在函数中把匿名函数返回,返回后调用它
function demo(){
    return $func = function($param){
        echo $param;
    };
}
$data = demo();
$data('hello world');

执行结果如下:


闭包

闭包的一个重要的概念就是在内部函数中可以使用外部变量,需要通过关键字use来连接闭包和外界变量,这些变量都必须在函数或类的头部声明。闭包函数是从父作用域中继承变量,与使用全局变量是不同的。全局变量存在于一个全局的范围中,无论当前正在执行的是哪个函数,而闭包的父作用域是定义该闭包的函数,不一定是调用它的函数。

闭包的语法如下:

$func = function() use(){
 。。。
};

下面我们通过具体的代码了解关键字use的使用:

<?php
//将匿名函数作为参数传递
function func($callback){
    $callback();
}

$val = "你好";
func(function() use (&$val){
	echo "闭包函数传入的参数为:". $val;
});

执行结果如下:

use引用的变量是$val的副本,如果要完全引用,就要像上面的例子一样要在变量的前面加上符号“&”,上面所介绍的closure只是全局的的匿名函数,如果现在我们想指定一个类有一个匿名函数,那这个匿名函数的访问范围不再是全局的,而是一个类的访问范围。关于PHP Closure 类的声明和使用,我们后续单独详细介绍。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。