時間: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。
- $func?=?function?()?{?...?}; ?
- array_walk($arr,?$func);?
從實現(xiàn)上來說, 第一種方式: 傳遞函數(shù)名字符串是最簡單的。而第二種方式create_function, 其實和第一種方式本質上一樣的, create_function返回一個字符串的函數(shù)名, 這個函數(shù)名的格式是:
- "\000_lambda_"?.?count(anonymous_functions)++?
- ?
我們來看看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ù)。
我們來驗證下:
- php?
- create_function("",?'echo?__FUNCTION__;'); ?
- call_user_func("\000lambda_1",?1); ?
- ?>?
- //輸出 ?
- __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類, 所以也不能做為基類派生子類.
- //php-5.3.0 ?
- $class?=?new?ReflectionClass("Closure"); ?
- var_dump($class->isInternal()); ?
- var_dump($class->isAbstract()?); ?
- var_dump($class->isFinal()); ?
- var_dump($class->isInterface()); ?
- //輸出: ?
- bool(true) ?
- bool(false) ?
- bool(true) ?
- bool(false) ?
- ?>?
而PHP 5.3中對閉包的支持, 也僅僅是把要保持的外部變量, 做為Closure對象的"Static屬性"(并不是普通意義上的可遍歷/訪問的屬性).
- //php-5.3.0 ?
- $b?=?"laruence"; ?
- $func?=?function($a)?use($b)?{}; ?
- var_dump($func); ?
- /*?輸出: ?
- object(Closure)#1?(2)?{ ?
- ["static"]=>?
- array(1)?{ ?
- ["b"]=>?
- string(8)?"laruence" ?
- } ?
- ["parameter"]=>?
- array(1)?{ ?
- ["$a"]=>?
- string(10)?"<required>" ?
- } ?
- } ?
- */?
這個實現(xiàn), 個人認為和JS對閉包的支持比起來, 還是有些太簡陋了。
關鍵詞標簽:PHP,匿名函數(shù)
相關閱讀
熱門文章 plsql developer怎么連接數(shù)據(jù)庫-plsql developer連接數(shù)據(jù)庫方法 2021年最好用的10款php開發(fā)工具推薦 php利用淘寶IP庫獲取用戶ip地理位置 在 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采集)