php 闭包传参_关于php在闭包(匿名函数) 以及使用use将外层参数传入内层匿名函数...

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

所以闭包的写法虽然很优雅,但执行效率相对而言比较低,而且逻辑容易混淆,要谨慎使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值