在
JAVA
或一些常用的编程语言中,大多都有匿名函数,
PHP
在5.3中也新增了匿名函数,在5.4中新增了匿名函数中可以使用
$this
;如下是简单的匿名函数的使用
$a = 10;
$b = 20;
$sum = 0;
$sumFunc = function() use($a,$b,&$sum){
$sum += $a+$b;
};
$sumFunc();
echo $sum;//30
$sumFunc();
echo $sum;//60
$a=5;$b=5;
$sum = 5;
$sumFunc();
echo $sum;//35
在上述中匿名函数在其use子句中指定三个变量,$a、$b,是两个实参,第三个变量$sum前加一个&,意味着改变量可以用匿名函数中的引用而不是值来访问
class Demo{
private $mytext = "pri_demo";
public function testClosures(){
$a = 10;
$b = 20;
$sum = 0;
$str = "text";
$isFlag = true;
global $flag;
$flag = "mygloble_1";
$sumFunc = function() use($a,$b,&$sum,$str){
$sum += $a+$b;
echo $str; // text
var_dump($this); // object(Demo)#1 (1) { ["mytext":"Demo":private]=> string(8) "pri_demo" }
echo $this->mytext;// pri_demo
echo '$isFlag:'; // PHP Notice: Undefined variable: isFlag
var_dump($isFlag); // NULL
$str = "text_three";
echo $flag;//PHP Notice: Undefined variable: flag
global $flag;
echo $flag; // mygloble_2
$flag = "mygloble_3";
};
$str = "text_two";
$flag = "mygloble_2";
$sumFunc();
echo $sum; // 30
echo $str; // text_two
echo $flag; //mygloble_3
}
}
$demo = new Demo();
$demo->testClosures();
引用别人的一个说法:
所谓闭包,就是定义一段代码,同时对当时的运行上下文做一个快照,并捆绑在一起,用于在将来的某个时候让这段代码在当初的这个上下文中运行。
$a,$b,$sum,$str,$isFlag 这些变量都在函数或类的头部声明。 从父作用域中继承变量与使用全局变量是不同的。全局变量存在于一个全局的范围,无论当前在执行的是哪个函数。而 闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。
执行效率
data = range(0, 50000)
//1
foreach ($data as &$value) {
$value = makeSuffix($value, $suffix);
}
//2
foreach ($data as $value) {
$new[] = makeSuffix($value, $suffix);
}
//3
array_map(function($item) use ($suffix) {
return makeSuffix($item, $suffix);
}, $data);
经过5W次执行之后,从结果看1-3,大部分情况执行时间依次升高,其中一次执行结果时间如下
1:0.0260009765625
2:0.038002014160156
3:0.047003030776978
所以闭包的写法虽然很优雅,但执行效率相对而言比较低,而且逻辑容易混淆,要谨慎使用。