必包和匿名函数
概念:
PHP匿名函数(Anonymous functions)也叫闭包函数(closures)
匿名函数:
没有指定名称的函数,经常用作回调函数(callback)参数的值。
闭包:
在一个函数内部创建另一个函数。把内嵌的函数称为闭包,它可以访问外部函数的局部变量。
在编程领域我们可以通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包。
使用场景
1,回调函数:匿名函数可以作为回调函数,用于处理事件、异步任务等。
$x = 2;
$arr1 = array(1, 2, 3, 4, 5);
echo "<pre>";
print_r(array_map(function($v) use($x) {
return ($v + $x); // 数组中的每个元素值都加7
}, $arr1));
2,作为变量:匿名函数可以被赋值给一个变量,从而可以在不同的上下文中使用。
$printStrFunc = function( $str) {
echo $str;
};
callFunc( $printStrFunc);
3,作为参数:匿名函数可以作为函数参数,可以减少代码的复杂性,提高代码的可读性和可维护性。
function callFunc( $func) {
$func( "some string\r\n");
}
$printStrFunc= function( $str) {
echo $str;
};
callFunc( $printStrFunc);
4,实现函数式编程:闭包可以用于实现函数式编程中的高阶函数,例如map,reduce和filter等。
语法
变量名=function(){
函数体
};
底层原理
PHP将匿名函数当作对象处理,这些对象包含有关匿名函数的信息。当匿名函数被调用时,PHP 将创建一个新的闭包对象,并将该对象的上下文与当前作用域的变量一起传递给该函数。这使得匿名函数可以访问其定义时的变量,并且可以在需要时修改其状态。
因为匿名函数是对象,所以可以将它们分配给变量、传递给其他函数、存储在数组中等等。在 PHP 5.3 及以上版本中,匿名函数成为了一种重要的编程工具,因为它们可以使代码更加简洁和易于维护。
在PHP中,闭包的底层原理是将闭包函数对象和其定义域中的变量封装在一个类中。这个类有一个__invoke()方法,用于执行闭包函数。当闭包函数被调用时,PHP引擎会实例化这个类,并将闭包函数和定义域中的变量传递给类的构造函数。构造函数将这些数据保存在类的实例变量中,并返回实例对象。然后,调用实例对象的__invoke()方法,该方法执行闭包函数并返回结果。由于闭包函数和定义域中的变量都被保存在类的实例变量中,它们在闭包函数执行之后仍然存在。
匿名函数的底层原理与普通函数相似,都是将代码块封装成一个可调用的单元。匿名函数的代码块会被编译成一个Zend函数,函数名由系统自动生成。在PHP中,匿名函数可以访问其外部作用域中的变量,这个特性称为闭包。闭包是指在函数内部定义的函数可以访问函数外部的变量。
匿名函数目前是通过 Closure 类来实现的。
闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号;