2008年07月22日

[PHP] PHP 5.3 的 Lambda 和 closure ?

這篇也 Lag....這是前陣子的消息。

PHP 5.3 將有可能會有 Lambda (黏巴達?) 和 closure ,來源為 Request for Comments: Lambda functions and closures 這篇文章,所以以後 call_user_func 就不必再用蹩腳的字串來做為函式內容了。而且這是不是也表示 PHP 不但向 Java 靠攏,也開始向 JavaScript 靠攏了?

註:所以 Mark 剛剛跟我說 PHP 快變四不像了。

Lambda 語法如下:

function & (parameters) use (lexical vars) { body }

範例:

$lambda = function () { echo "Hello World!\n"; };

可以這樣用:

$lambda ();
call_user_func($lambda);
call_user_func_array($lambda, array());

所以 call_user_func 系列函式就可以用 Lambda 了。

進階的 Lambda 範例:

function replace_spaces ($text) {
    $replacement = function ($matches) {
        return str_replace ($matches[1], ' ', ' ').' ';
    };
    return preg_replace_callback ('/( +) /', $replacement, $text);
}

Closure 語法:

function (normal parameters) use ($var1, $var2, &$refvar) {}

範例:

function replace_in_array ($search, $replacement, $array) {
    $map = function ($text) use ($search, $replacement) {
        if (strpos ($text, $search) > 50) {
            return str_replace($search, $replacement, $text);
        } else {
            return $text;
        }
    };
    return array_map($map, $array);
}

可以看到原來可以用 callback 的函式,應該都能接受 closure 。

其他就請參考來源文章囉。

相關文章



Posted by jaceju at 樂多Roodo! │17:41 │回應(3) PHP
樂多分類:網路/3C 共同主題:PHP 程式設計 工具:加入樂多書籤編輯本文
Ads by Roodo! 
回應文章

有這麼新的版本喔!我還不知道說!
紀錄起來!
Posted by ㄚ琪 at 2008年07月23日 08:55

這樣寫法的好處是什麼呢?
效率會快點嗎?

我很怕這種寫法, 除錯時會越來越難.
Posted by No4 at 2008年07月23日 13:21

@丫琪:

PHP 已經到 6.0 了,不過目前 5.3 以後的版本都還在開發中,建議使用 5.2.6 以前的版本。

@No4:

其實之後 Xdebug 應該會因應這些特色作改良,因此 Debug 上應該會還好。至於效率,我不是很確定。而好處你可以參考 Ruby 或 JavaScript 上,利用這些特色做出來的成品。
Posted by jaceju at 2008年07月23日 14:13