文章正文
闭包是在创建时封装周围状态的函数。 虽然闭包所在的环境不再存在php闭包函数,但是闭包中封装的状态仍然存在。
匿名函数是没有名称的函数。 匿名函数可以参数化为变量,这些变量可以像任何其他 PHP 对象一样传递。 不过,匿名函数仍然是一个函数,所以它可以被调用,也可以传递参数。 匿名函数非常适合函数或技巧反弹。
注意:理论上,闭包和匿名函数是不同的概念。 然而,PHP 将它们视为同一概念。 因此,当我们谈论闭包时,我们指的是匿名函数,反之亦然。
PHP 闭包和匿名函数使用与普通函数相同的复合句,但闭包和匿名函数显然是伪装成函数的对象(Closure 类的实例)。
创造封闭
$闭包=函数($名称){
返回 printf("Hello%s", $name);
}echo $closure("jerry");//检查$closure变量是否是一个闭包 var_dump($closureinstanceofClosure);
上面的代码创建了一个闭包对象,然后将其形参分配给 $closure 变量。 闭包与普通的 PHP 函数非常相似,使用相同的复杂语句、接收参数、返回值。
说明:我们之所以仍然可以调用 $closure 变量,是因为这个变量的值是一个闭包php闭包函数,但是闭包对象实现了 __invoke() 魔术。 只要变量名后面有(),PHP就会找到并调用__invoke()方法。
使用闭包
我们通常使用 PHP 闭包作为函数和技巧的反弹。 许多PHP函数都会使用反弹函数,例如array_map()和preg_replace_callback()。 在下面的示例中,我们将使用 array_map() 来处理链表并将链表的每一项加 1:
$numbers=array_map(函数($number){
返回$数字++;
},[1,2,3]);
var_dump($数字);
附加状态
PHP 闭包不像真正的 javascrypt 闭包那样手动封装应用程序的状态。 我们必须自动调用闭包对象的bindTo()方法或使用use关键字将状态附加到PHP闭包。
使用 use 关键字
使用 use 关键字附加闭包状态变得越来越常见,所以让我们首先看看这些方法。 当使用 use 关键字将变量附加到闭包时,附加变量将记住附加时分配给它的值。
函数汽车($名称){
返回函数($statu)使用($name){
returnsprintf("汽车%sis%s", $name, $statu);
}//将汽车名称封装在闭包中 $car=Car("bmw");//调用汽车的动作 //输出 --> "bmwisrunning" echo $car("running");
注意:使用 use 关键字将多个参数传递到闭包中。 在这种情况下,请使用冒号分隔多个参数,例如 PHP 函数或技术的参数。
使用bindTo()方法附加闭包的状态
与其他 PHP 对象一样,每个 Closure 实例都可以使用 $this 关键字访问 Closure 的内部状态。 闭包对象的默认状态是无用的,但是有一个 __invoke() 魔术和 bindTo() 方法。
bindTo() 方法减少了一些有趣的闭包潜力。 我们可以使用这个方法将 Closure 对象的内部状态绑定到其他对象。
bindTo()方法的第二个参数非常重要,它的作用是指定绑定闭包的对象所属的PHP类。 为此,闭包可以访问闭包所绑定的对象的受保护和私有成员变量。
类测试闭包{
私有$名称=[];
私人$年龄;
私人$性;
公共函数 addPerson($name, $personCallback){
//将闭包对象绑定到当前实例 $this->name[$name]=$personCallback->bindTo($this,__CLASS__);
公共函数显示($名称){
foreach($this->nameas $key=>$callback){
如果($键==$名称){
//执行闭包对象并将闭包状态附加到类 $callback();
echo "名称:{$name}n";
echo "年龄:{$this->年龄}n";
echo "性别:{$this->性别}n";
$person=newTestClosure();
$person->addPerson("杰瑞", function(){
$这个->年龄=19;
$this->性别=“男人”;
});
$person->display("jerry");/**输出
姓名:杰瑞
年龄:19
性别: 男
*/