河南龙祥软件科技有限公司
He Nan Long Xiang Software Technology Co., Ltd.
24小时服务热线:18236995786
php中有一种函数是匿名函数,这类函数没有名字,但是它可以作为参数,也可以赋值给一个变量,因为没有名字,所以它就叫匿名函数。这种函数主要用在临时用一次的场景和作为回调函数时,比如有的函数通篇就用一次,此时给它起个名字很麻烦,此时就可以用匿名函数,还有就是函数也可以作为一个参数使用,此时用匿名函数非常合适。
普通函数长这样:
function say($name){
echo "我的名字是:".$name;
}
可以看出来它的名字是say,有一个参数是$name。
使用时这样用:say("张三");
执行的结果:我的名字是:张三
匿名函数长这样:
$say=function($name){
echo "我的名字是:".$name;
}
可以看到function后面没有名字,直接就是参数,所以它叫匿名函数,但是这个函数被赋值给了一个变量$say,所以这个$say就可以表示这个匿名函数。
使用时这样用:$say("张三");
执行的结果:我的名字是:张三
有人可能会说虽然没名字,但是它把自己给了一个变量,用起来和普通函数没啥区别,那是因为还有第二种形式你没看到。
第二种匿名函数,回调函数场景:
function say($name,$run){
echo "我的名字是:".$name.",接下来我要抽奖";
$number=rand(1,20);
$run($number);
}
say("张三",function($number){
echo "<br/>我抽奖的数字是:".$number;
});
执行的结果是:我的名字是:张三,接下来我要抽奖
我抽奖的数字是:12
在这段代码中定义了一个函数say,它接受两个参数,一个是名字,另一个是介绍完自己后要执行的动作,这里是$run表示抽奖,因为抽中数字几是在介绍完名字后产生的,所以就要给抽奖动作传一个参数$number。
下面执行介绍函数say,传名字进去,第二个参数是一个匿名函数,这个匿名函数需要一个参数,在函数里面是介绍自己抽中的奖品数字,因为这个函数不会在别的地方使用,起个名字也没意义,所以就用匿名函数。
整段代码首先执行say函数,传了一个名字和一个函数过去了,到了say函数中执行第一句介绍自己,然后生成抽奖数字,再然后执行第二个参数也就是那个匿名函数,并且因为匿名函数需要一个参数,这里就把参数传过去,然后就进入匿名函数中执行,此时得到了那个参数,就把结果展示出来了。
第三种使用场景:给匿名函数绑定一个类,然后像操作这个类一样操作匿名函数。
class ren{
public $name;
public function say(){
echo "我的名字是:".$this->name;
}
}
$zhang=function(){
$this->name="张三";
return $this;
}
$zhang=$zhang->bindTo(new ren());
$zhang()->say();
执行的结果是:我的名字是:张三
在这里首先定义了一个类ren,这个类里有属性name和方法say()。
然后定义了一个匿名函数,把这个匿名函数赋值给$zhang,这个匿名函数如果绑定了一个对象,那么匿名函数中的$this就是这个绑定的对象,给$this的name赋值就是在给这个对象的name赋值。最后返回这个对象。
再然后执行$zhang->bindTo(new ren()),它就是把ren这个类实例化出来一个对象并绑定给$zhang,所以$zhang这个匿名函数里的$this就是ren这个类的对象,执行$zhang()就是在执行这个匿名函数,因为它把ren的对象给返回了,所以$zhang()就是ren的对象,就可以使用ren里的say方法。
第四种场景:在一个类里定义匿名函数。
class ren{
public $name;
public function say(){
echo "我的名字是:".$this->name;
}
public function run(){
$zhang=function(){
$this->name="张三";
$this->say();
};
$zhang();
}
}
$r=new ren();
$r->run();
执行的结果是:我的名字是:张三
在这里可以看到匿名函数在ren这个类的run方法中,且匿名函数没有使用bindTo()函数绑定任何类,但是在匿名函数中仍然使用$this给name属性赋值了,还是用了say()方法,这是 因为如果一个匿名函数被定义在类中,则它自动绑定所在的类,不需要再使用bindTo()函数,因为匿名函数只是一个函数,不执行它不会运行,所以在定义过匿名函数后使用$zhang();来执行以下这个匿名函数,最后就看到效果了。
匿名函数的use中的数据也是参数,函数的小括号中也是参数,同样都是参数它们有什么区别呢,区别就是use中的参数值在定义匿名函数的时候就确定了,后续这个参数的值在匿名函数外部怎么改变都不会影响到它,它会被存放在static参数的数组中。而小括号中的参数是在使用这个匿名函数的时候传递进去的,例如:
$name="张三";
$ren=function($run) use($name){
echo "我是".$name.",我会:".$run;
}
$name="李四";
$ren("唱歌");
执行的结果是:我是张三,我会:唱歌
从这里可以看到$name在匿名函数定义过后被改变了,但是在后面执行匿名函数后,看到的名字仍然是张三,没有变成李四。
友情链接 LINKS
扫码加微信
关注公众号