閉包函式的特性和作用及應用場合
阿新 • • 發佈:2019-02-09
<?php
/*1.匿名函式也叫閉包函式,顧名思義就是沒有名字的函式;
2.因為沒有名字,所以匿名函式不能直接呼叫,需要先將匿名函式賦值給一個變數,然後由變數函式的形式來呼叫;
3.匿名函式在函式體結束後必須在}後加上";",這也是它與普通函式的區別;
4.匿名函式可以正常傳引數和參與計算;
*/
$var=function($a,$b,$c)
{
return $a+$b+$c;
};//加分號,切記
var_dump($var);//輸出變數型別為一個物件,且隸屬於closure類中
echo $var(1,2,3);//輸出6
echo "<br>";
/*5.我們知道,函式不能直接使用外部定義的全域性變數,要想在函式中使用必須加上global關鍵字;
6.閉包函式的概念通俗的講:就是在子函式中可以直接呼叫父函式中所定義的變數;
7.要想讓子函式使用父函式中的變數必須使用關鍵字use來實現
*/
function demo()//父函式demo
{
$a=10;
$b=20;
function one()//子函式one
{
global $a;
echo "1111111111{$a}111111<br>";//無法直接輸出在父函式中定義的變數$a,如若宣告global,則會呼叫函式外部的全域性變數
}
function two()//子函式two
{
global $b;
echo "222222222222222{$b}<br>";//無法輸出$b,在子函式中定義了global也不行
}
$three=function()use($a,$b)//子函式/匿名函式$three(),在匿名函式中使用use加父函式中的變數名就可以在子函式中輸出
{
echo "--$a--aaaaaa--$b--<br>";//可以正常輸出$a和$b
};//切記加分號
$three();
}
demo();
/*
8.當內層函式呼叫外部函式的變數時,要加引用,否則不會改變區域性變數在函式中的值;
9.閉包的外部是個函式,內部是一個匿名函式;
10.閉包函式的作用就是保護閉包中的記憶體變數,閉包執行完畢後閉包內部的變數不會存在,而外部函式的變數則會儲存;
*/
function test()
{
$a=10;
$b=20;
$inter=function()use(&$a,&$b)//加引用
{
echo $a,$b."<br>";
$a++;
$b++;
echo $a,$b."<br>";
//return,內層函式不能加返回值
};
return $inter;
}
$test=test();
$test();
$test();
$test();//多次輸出後發現區域性變數的值並不會被釋放
//11.匿名函式可以當引數來使用
function test1($func)
{
echo $func();
echo "<br>";
}
test1(function(){
return "$$$$$$$$";
});//直接將一個匿名函式當做引數傳入函式中;
?>
/*1.匿名函式也叫閉包函式,顧名思義就是沒有名字的函式;
2.因為沒有名字,所以匿名函式不能直接呼叫,需要先將匿名函式賦值給一個變數,然後由變數函式的形式來呼叫;
3.匿名函式在函式體結束後必須在}後加上";",這也是它與普通函式的區別;
4.匿名函式可以正常傳引數和參與計算;
*/
$var=function($a,$b,$c)
{
return $a+$b+$c;
};//加分號,切記
var_dump($var);//輸出變數型別為一個物件,且隸屬於closure類中
echo $var(1,2,3);//輸出6
echo "<br>";
/*5.我們知道,函式不能直接使用外部定義的全域性變數,要想在函式中使用必須加上global關鍵字;
6.閉包函式的概念通俗的講:就是在子函式中可以直接呼叫父函式中所定義的變數;
7.要想讓子函式使用父函式中的變數必須使用關鍵字use來實現
*/
function demo()//父函式demo
{
$a=10;
$b=20;
function one()//子函式one
{
global $a;
echo "1111111111{$a}111111<br>";//無法直接輸出在父函式中定義的變數$a,如若宣告global,則會呼叫函式外部的全域性變數
}
function two()//子函式two
{
global $b;
echo "222222222222222{$b}<br>";//無法輸出$b,在子函式中定義了global也不行
}
$three=function()use($a,$b)//子函式/匿名函式$three(),在匿名函式中使用use加父函式中的變數名就可以在子函式中輸出
{
echo "--$a--aaaaaa--$b--<br>";//可以正常輸出$a和$b
};//切記加分號
$three();
}
demo();
/*
8.當內層函式呼叫外部函式的變數時,要加引用,否則不會改變區域性變數在函式中的值;
9.閉包的外部是個函式,內部是一個匿名函式;
10.閉包函式的作用就是保護閉包中的記憶體變數,閉包執行完畢後閉包內部的變數不會存在,而外部函式的變數則會儲存;
*/
function test()
{
$a=10;
$b=20;
$inter=function()use(&$a,&$b)//加引用
{
echo $a,$b."<br>";
$a++;
$b++;
echo $a,$b."<br>";
//return,內層函式不能加返回值
};
return $inter;
}
$test=test();
$test();
$test();
$test();//多次輸出後發現區域性變數的值並不會被釋放
//11.匿名函式可以當引數來使用
function test1($func)
{
echo $func();
echo "<br>";
}
test1(function(){
return "$$$$$$$$";
});//直接將一個匿名函式當做引數傳入函式中;
?>