您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關PHP中匿名函數的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
◆字符串的函數名
◆使用create_function的返回
51CTO推薦專題:PHP開發基礎入門
在PHP5.3以后, 我們多了一個選擇, 也就是Closure。
$func = function () { ... }; array_walk($arr, $func);
從實現上來說, ***種方式: 傳遞函數名字符串是最簡單的。而第二種方式create_function, 其實和***種方式本質上一樣的, create_function返回一個字符串的函數名, 這個函數名的格式是:
"\000_lambda_" . count(anonymous_functions)++
我們來看看create_function的實現步驟:
1. 獲取參數, 函數體;
2. 拼湊一個"function __lambda_func (參數) { 函數體;} "的字符串;
3. eval;
4. 通過__lambda_func在函數表中找到eval后得到的函數體, 找不到就出錯;
5. 定義一個函數名:"\000_lambda_" . count(anonymous_functions)++;
6. 用新的函數名替換__lambda_func;
7. 返回新的函數。
我們來驗證下:
<?php create_function("", 'echo __FUNCTION__;'); call_user_func("\000lambda_1", 1); ?> //輸出 __lambda_fun
因為在eval的時候, 函數名是”__lambda_func”, 所以匿名函數內會輸出__lambda_func, 而因為***用”\000_lambda_”.count(anonymous_functions)++重命名了函數表中的”__lambda_func”函數, 所以可通過”\000_lambda_” . count(anonymous_functions)++調用這個匿名函數。為了證實這一點, 可以將create_function的返回值dump出來查看。
而在PHP 5.3發布的時候, 其中有一條new feature就是支持閉包/Lambda Function, 我***反應是以為zval新增了一個IS_FUNCTION, 但實際上是構造了一個PHP 5.3引入的Closure”類”的實例, Closure類的構造函數是私有的, 所以不能被直接實例化, 另外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>" } } */
上述就是小編為大家分享的PHP中匿名函數的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。