日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入理解PHP中的匿名函數(shù)

匿名函數(shù)的作用就是擴大函數(shù)的使用功能,在PHP 5.3以前,傳遞Callback的方式,我們只有倆種選擇:

10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有如東免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

◆字符串的函數(shù)名

◆使用create_function的返回

推薦專題:PHP開發(fā)基礎(chǔ)入門

在PHP5.3以后, 我們多了一個選擇, 也就是Closure。

 
 
 
  1. $func = function () { ... };  
  2. array_walk($arr, $func); 

從實現(xiàn)上來說, ***種方式: 傳遞函數(shù)名字符串是最簡單的。而第二種方式create_function, 其實和***種方式本質(zhì)上一樣的, create_function返回一個字符串的函數(shù)名, 這個函數(shù)名的格式是:

 
 
 
  1. "\000_lambda_" . count(anonymous_functions)++ 
  2.  

我們來看看create_function的實現(xiàn)步驟:

1. 獲取參數(shù), 函數(shù)體;

2. 拼湊一個"function __lambda_func (參數(shù)) { 函數(shù)體;} "的字符串;

3. eval;

4. 通過__lambda_func在函數(shù)表中找到eval后得到的函數(shù)體, 找不到就出錯;

5. 定義一個函數(shù)名:"\000_lambda_" . count(anonymous_functions)++;

6. 用新的函數(shù)名替換__lambda_func;

7. 返回新的函數(shù)。

我們來驗證下:

 
 
 
  1. create_function("", 'echo __FUNCTION__;');  
  2. call_user_func("\000lambda_1", 1);  
  3. ?> 
  4. //輸出  
  5. __lambda_fun 

因為在eval的時候, 函數(shù)名是”__lambda_func”, 所以匿名函數(shù)內(nèi)會輸出__lambda_func, 而因為***用”\000_lambda_”.count(anonymous_functions)++重命名了函數(shù)表中的”__lambda_func”函數(shù), 所以可通過”\000_lambda_” . count(anonymous_functions)++調(diào)用這個匿名函數(shù)。為了證實這一點, 可以將create_function的返回值dump出來查看。

而在PHP 5.3發(fā)布的時候, 其中有一條new feature就是支持閉包/Lambda Function, 我***反應(yīng)是以為zval新增了一個IS_FUNCTION, 但實際上是構(gòu)造了一個PHP 5.3引入的Closure”類”的實例, Closure類的構(gòu)造函數(shù)是私有的, 所以不能被直接實例化, 另外Closure類是Final類, 所以也不能做為基類派生子類.

 
 
 
  1. //php-5.3.0  
  2. $class = new ReflectionClass("Closure");  
  3. var_dump($class->isInternal());  
  4. var_dump($class->isAbstract() );  
  5. var_dump($class->isFinal());  
  6. var_dump($class->isInterface());  
  7. //輸出:  
  8. bool(true)  
  9. bool(false)  
  10. bool(true)  
  11. bool(false)  
  12. ?> 

而PHP 5.3中對閉包的支持, 也僅僅是把要保持的外部變量, 做為Closure對象的”Static屬性”(并不是普通意義上的可遍歷/訪問的屬性).

 
 
 
  1. //php-5.3.0  
  2. $b = "laruence";  
  3. $func = function($a) use($b) {};  
  4. var_dump($func);  
  5. /* 輸出:  
  6. object(Closure)#1 (2) {  
  7. ["static"]=> 
  8. array(1) {  
  9. ["b"]=> 
  10. string(8) "laruence"  
  11. }  
  12. ["parameter"]=> 
  13. array(1) {  
  14. ["$a"]=> 
  15. string(10) ""  
  16. }  
  17. }  
  18. */ 

這個實現(xiàn), 個人認為和JS對閉包的支持比起來, 還是有些太簡陋了。

【編輯推薦】

  1. 那些未曾了解的PHP函數(shù)和功能
  2. 為你總結(jié)一些PHP信息函數(shù)
  3. PHP parent調(diào)用父類構(gòu)造函數(shù)

標題名稱:深入理解PHP中的匿名函數(shù)
標題來源:http://m.5511xx.com/article/dhoecsp.html