您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
php回调、递归、匿名与闭包学习笔记-闭包函数
发布时间:2018-04-30 10:37:14编辑:雪饮阅读()
<?php
/*
闭包的基本概念
通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫做闭包!
*/
/*
内部函数
根据闭包的概念,闭包该从内部函数说起
*/
/*
通常一个方法太大,那么可以在方法体内再分多个方法以提供给内部调用,这种函数体内的函数称为内部函数。
但内部函数也可以被外部调用。如下就是外部函数调用内部函数。
由于内部函数再次声明函数就相当于把新声明的函数在内存中存储了,那么只需要运行其父(伪父)函数则外部就可以调用新声明的函数了。
这种使用方法就不太妥当了。如果需要外部调用,可以单独放置函数于外部即可。
*/
/*
function one(){
echo "11111<br/>";
function two(){
echo "2222<br/>";
}
function three(){
echo "3333<br/>";
}
}
one();
three();
*/
//内部函数的正确用法
/*
function one(){
echo "11111<br/>";
function two(){
echo "2222<br/>";
}
function three(){
echo "3333<br/>";
}
two();
three();
}
one();
*/
/*
按照闭包的概念内部函数的正确用法仍然还不是闭包,闭包需要的是内部函数能调用其伪父函数内上下文的局部变量
如下,虽然是正确的内部函数用法,若直接调用其伪父函数内上下文的局部变量$a则会直接报错,
若是用global $a在调用前声明下则也会调用空值,就算除非全局有一个变量$a,但是这样以来调用的则是全局的变量$a
那么这样就不满足伪父函数内上下文局部变量调用的特点了。
*/
/*
$a=500;
function one(){
$a=100;
echo "11111<br/>";
function two(){
global $a;
echo "2222 $a<br/>";
}
function three(){
echo "3333<br/>";
}
two();
three();
}
one();
*/
/*
闭包还有一种错误理解如下
这种看似实现了闭包,但是这是以参数的形式传递进去的并不是伪父函数内上下文的局部变量调用
*/
/*
function printStr(){
$func=function($str){
echo $str;
};
$func("dmjLoveXy");
}
printStr();
*/
/*
简单闭包实现
其实闭包中能访问其伪父函数内局部变量靠的是use关键字来传递的,如下这种方式算是一个简单的闭包的实现
*/
function demo(){
$a=100;
$b=20;
$one=function($str) use ($a,$b){
echo "$str<br/>";
echo "$a<br/>";
echo "$b<br/>";
};
$one("dmjLoveXy");
}
demo();
闭包的完善
<?php
/*
真正的闭包需要满足对父函数局部变量的使用,可是简单闭包并没有实现这一点。
虽然用了use,但use只是相当于做了一个变量副本而已,在闭包内部函数内的局部变量每次会被重新初始化。
内部函数中$a的值虽然变了,但是在父函数内的局部变量$a没有变
*/
/*
function demo(){
$a=100;
$one=function() use ($a){
$a++;
echo "$a<br/>";;
};
$one();
echo "<br/>----out:$a----<br/>";
}
demo();
demo();
*/
/*
在use使用变量引用传参的时候可以实现局部变量的完全使用,内部函数体内对父函数的局部变量值的改变也会生效,
而不仅仅只是副本生效了。
*/
/*
function demo(){
$a=100;
$one=function() use (&$a){
$a++;
echo "$a<br/>";;
};
$one();
echo "<br/>----out:$a----<br/>";
}
demo();
demo();
*/
/*
闭包函数还要求内部返回一个函数的引用,而不是直接在内部使用匿名函数,所以上面的这种仍然不能成为真正的闭包函数,
如下实现闭包函数返回一个函数的引用
*/
/*
function demo(){
$a=100;
$one=function() use (&$a){
$a++;
echo "$a<br/>";;
};
return $one;
}
$one=demo();
$one();
*/
/*
闭包函数的真正实现
上面这种闭包函数不仅满足了闭包函数特性即内部返回一个函数的引用,而且实现了闭包函数要求伪父函数局部变量的驻留,
如下,对该函数调用多次,发现伪父函数内局部变量$a值每次调用都不会重新初始化而是不断自增的
*/
/*
function demo(){
$a=100;
$one=function() use (&$a){
$a++;
echo "$a<br/>";;
};
return $one;
}
$one=demo();
$one();
$one();
$one();
*/
/*
闭包函数建议不要在内部函数中return,有可能会导致直接不执行了。如下就是不建议的一种闭包形式,内层函数有return。
*/
/*
function demo(){
$a=100;
$one=function() use (&$a){
$a++;
echo "$a<br/>";;
return "";
};
return $one;
}
$one=demo();
$one();
$one();
$one();
*/
/*
匿名函数体可当参数使用
*/
function demo($fun){echo $fun();}
demo(function(){return "dmj";});
demo(function(){return "Love";});
demo(function(){return "Xy";});
关键字词:php,闭包