IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機版|論壇轉貼|軟件發(fā)布

您當前所在位置: 首頁網(wǎng)絡編程PHP編程 → 深入理解PHP中的匿名函數(shù)

深入理解PHP中的匿名函數(shù)

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)

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

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

◆使用create_function的返回

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

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

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

從實現(xiàn)上來說, 第一種方式: 傳遞函數(shù)名字符串是最簡單的。而第二種方式create_function, 其實和第一種方式本質上一樣的, 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. php?
  2. create_function("",?'echo?__FUNCTION__;'); ?
  3. call_user_func("\000lambda_1",?1); ?
  4. ?>?
  5. //輸出 ?
  6. __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)++調用這個匿名函數(shù)。為了證實這一點, 可以將create_function的返回值dump出來查看。

而在PHP 5.3發(fā)布的時候, 其中有一條new feature就是支持閉包/Lambda Function, 我第一反應是以為zval新增了一個IS_FUNCTION, 但實際上是構造了一個PHP 5.3引入的Closure"類"的實例, Closure類的構造函數(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)?"<required>" ?
  16. } ?
  17. } ?
  18. */?

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

關鍵詞標簽:PHP,匿名函數(shù)

相關閱讀

文章評論
發(fā)表評論

熱門文章 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 2021年最好用的10款php開發(fā)工具推薦 2021年最好用的10款php開發(fā)工具推薦 php利用淘寶IP庫獲取用戶ip地理位置 php利用淘寶IP庫獲取用戶ip地理位置 在 PHP 中使用命令行工具 在 PHP 中使用命令行工具

相關下載

    人氣排行 詳解ucenter原理及第三方應用程序整合思路、方法 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 PHP中防止SQL注入攻擊 PHP會話Session的具體使用方法解析 PHP運行出現(xiàn)Notice : Use of undefined constant 的解決辦法 PHP如何清空mySQL數(shù)據(jù)庫 CakePHP程序員必須知道的21條技巧 PHP采集圖片實例(PHP采集)