php的閉包(Closure)也就是匿名函數。是PHP5.3引進的。
閉包的語法很簡單,需要注意的關鍵字就只有use,use意思是連結閉包和外界變數。
1
2
#3
|
[php ] view plain copy
$a = function () use ( $b ) {
#}
|
##閉包的幾個作用:
1 減少foreach的迴圈的程式碼
1
#2
3
4
5
6
7
8
9
10
11
12
13
14 ##1516#17181920212223#242526272829#30
313233 |
34 #35 #36 #37# 38 3940 41#42
[php] view plain copy
<?php
#// 一個基本的購物車,包括一些已經加入的商品和每種商品的數量。
// 其中有一個方法用來計算購物車中所有商品的總價格。此方法使用了一個closure作為回呼函數。
class Cart
#{
## const PRICE_BUTTER = 1.00;
const #PRICE_MILK # = 3.00; PRICE_MILK # = 3.00; ##o>
##' const PRICE_EGGS = 6.95;
protec = array ();
# public ##function add( $product , $quantity ) #{
$this
->products[ $product #->products[ $product##] = $quantity ;
# }
public function getQuantity(##$product )
#{
return isset( $this ->products[ $product ]) ? $this ->products[ $product ] :
FALSE;
# ##} # public function #getTotal(
$tax )
##{
$total = 0.00;
## #$callback =
#function #( #$1ity
##, $product ) use ( $tax , &$total )
#{ # #$pricePerItem = constant(CLASS . "::PRICE_" .
strtoupper ( ###$product######)); ############ # = (######$pricePerItem### ###*######$quantity######) * (######$tax### ### 1.0 ); ############ ######}; ############ ####$this######->products,######$callback######); ############ ########## ####### #return### ###round######(######$total######, 2);; ############ #### ###} ############} #############$my_cart### ###=######new### ## #Cart; ############// 往購物車裡新增條目 ######$my_cart ->add( 'butter' , 1);
# $my_cart ->add( 'milk' #, 3);
##$my_cart ->add( 'eggs' , 6);
// 打出總價格,其中有5% 的銷售稅.
print $my_cart ->getTotal(0.05) . "\n" ;
// The result is 54.29
##?>
|
#這裡如果我們改造getTotal函數必然要使用到foreach
2 減少
函數的參數
##1
234#56789
| [php] view plain
copy
function html ( $code , #$id =##"" , $class = "" ){ ##if (
$id !== "" ) $id = " id = \"$id\"" ;
$class = (
$class !== "" )? " class =\"$class\"" : ">" ;
#$open =
"< ;$code$id$class" ;
$close =
"$code>" ;
return function ( $inner = "" ) use ( #$open , #$ close ){
return "$open$inner$close"
;}; #}
如果是使用平時的方法,我們會把inner放到html | 函數參數
中,這樣不管是程式碼讀取或使用都不如使用閉包
3 解除遞迴函數
##1
2
3
4
5
#6
7
8
9
10
[php] view plain copy |
<?php
$fib =function #( $n ) use (&amp; #$fib ) {
if #($n == 0 || #$n #== 1) return 1;
# #return $fib( $n - 1) $fib ( ##$n - 2);
};
卷 echo
# #echo # $fib (2) . "\n" ; // 2
$lie = $fib ;
#$fib = function (){ die (##'error' );}; //rewrite $fib variable
echo $lie (5); // error because $fib is referenced by closure
|
注意上題中的use使用了&,這裡不使用&會出現錯誤n-1)是找不到function的(前面沒有定義fib的型別)
所以想使用閉包解除循環函數的時候就需要使用
1
#2
3 ##4 5
|
[php] view plain #copy
<?php
##$recursive = function () use (&amp; $recursive ){
// The function is now available as $recursive
#} |
這樣的形式
4 關於延遲綁定
如果你需要延遲綁定use裡面的變量,你就需要使用引用,否則在定義的時候就會做一份拷貝放到use中
#1
2
3
4
5
6
#7
8 ##9#10111213 |
[php] view plain #copy
<?php
#$result = 0;
#$one = function ()
{ var_dump( $result ); };
$two = function () use ( $result )
#{ var_dump( $result ); };
$three = function##() use (&amp; $result )
#{ var_dump( $result ); };
$result ;
$one ##() ; // outputs NULL: $result is not in scope
$two##(); #// outputs int(0): $result was copied
$three(); // outputs int(1)
|
#使用引用與不使用引用就代表了是呼叫時賦值,還是申明時候賦值
上面是我整理給大家的PHP閉包function() use()中的詳細使用方法,希望未來會對大家有幫助。
更多PHP相關技術文章,請造訪
PHP教學欄位進行學習!
以上是PHP閉包function() use()中的詳細使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!