PHP中闭包函数和匿名函数的区别是什么

  介绍

本篇文章为大家展示了PHP中闭包函数和匿名函数的区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

匿名函数就是没有名称的函数。匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递,不过匿名函数仍是函数,因此可以调用,还可以传入参数。匿名函数特别适合作为函数或方法的回调。

注意:理论上讲,闭包和匿名函数是不同的概念,不过,PHP将其视作相同的概念,所以,我们提到闭包时,指的也是匿名函数,反之亦然。

PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(闭包类的实例)。

<强>创建闭包

closure 美元;=,函数(美元名称){   return 才能;sprintf (“Hello  % s",,美元名称);   }   echo 美元关闭(“jerry");//,检测美元关闭变量是否是一个闭包   var_dump (closure 美元;instanceof 关闭);

以上代码创建了一个闭包对象,然后将其赋值给美元关闭变量。闭包和普通的PHP函数很像,使用的句法相同,也接收参数,而且能返回值。

说明:我们之所以能够调用美元关闭变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()魔术方法。只要变量名后有(),PHP就会查找并调用<代码> __invoke() 方法。

<强>使用闭包

我们通常把PHP闭包当做当做函数和方法的回调使用。很多PHP函数都会用到回调函数,例如<代码>到()和<代码> preg_replace_callback()里> nubmers 美元;=,到函数(美元){   return 才能;$ + +;   },,(1、2、3));   var_dump(数字)美元;

<强>附加状态

PHP闭包不会像真正的javascrypt闭包那样自动封装应用的状态,我们必须手动调用闭包对象的bindTo()方法或者使用使用关键字,把状态附加到PHP闭包上。

<强>使用使用关键字

使用使用关键字来附加闭包状态更加常见,因此我们先来看这种方式。使用使用关键字把变量附加闭包上时,附加的变量会记住附加时赋给它的值。

function  Car (名字){   return 才能;函数(该队美元)使用(美元名称){   ,,,return  sprintf (“Car  % s  is  % s",,名字,美元,该队美元),,   ,,}   }//,将车名封装在闭包中   $ car =,汽车(“bmw");//,调用车的动作//,输出,祝辞,“bmw  is  running"   echo 汽车美元(“running");

注意:使用使用关键字可以把多个参数传入闭包,此时要像PHP函数或方法的参数一样,使用逗号分隔多个参数。

<强>使用bindTo()方法附加闭包的状态

与其它PHP对象类似,每个闭包实例都可以使用美元这关键字获取闭包的内部状态。闭包对象的默认状态没什么用,不过有一个__invoke()魔术方法和bindTo()方法。

bindTo()方法为闭包增加了一些有趣的潜力。我们可以使用这个方法把关闭对象的内部状态绑定到其它对象上。

bindTo()方法的第二个参数很重要,其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员变量。

class  TestClosure   {   private 才能;$ name=[];   美元private 才能;年龄;   private 才能;美元性;   public 才能;function  addPerson(名称、美元,美元personCallback) {   ,,,//,将闭包对象绑定当前实例   ,,,这美元→名称[名字]美元,=,美元personCallback→bindTo ($ this, __CLASS__进行);   ,,}   public 才能;function 显示器(美元名称){   ,,,foreach  ($ this→name  as  key 美元;=祝辞,回调美元){   ,,,,,如果美元($ key ==,名字){   ,,,,,,,//,执行闭包对象,将闭包状态附加到类   ,,,,,,,回调()美元;   ,,,,,}   ,,,}   ,,,echo “name :,{$名称}\ n";   ,,,echo “age :, {$ this→年龄}\ n";   ,,,echo “sex :, {$ this→性}\ n";   ,,}   }   $ person =, new  TestClosure ();   人→美元addPerson (“jerry",,函数(){   这个美元才能→age =, 19;   这个美元才能→sex =,“man";   });   人→美元显示(“jerry");/* *,输出   name :杰瑞   age : 19   sex :男人   */

PHP中闭包函数和匿名函数的区别是什么