首頁 後端開發 php教程 什麼是匿名函數

什麼是匿名函數

Jan 22, 2019 am 09:23 AM
匿名函數

匿名函數 

匿名函數(Anonymous functions),也稱為閉包函數(closures),允許 暫時建立一個沒有指定名稱的函數。最常用作回呼函數(callback)參數的值。當然,也有其它所應用的情況。

什麼是匿名函數

匿名函數目前是透過 Closure 類別來實現的。

匿名函數範例

<?php
echo preg_replace_callback(&#39;~-([a-z])~&#39;, function ($match) {
    return strtoupper($match[1]);
}, &#39;hello-world&#39;);
// 输出 helloWorld
?>
登入後複製

閉包函數也可以當作變數的值來使用。 PHP 會自動把此種表達式轉換成內建類別 Closure 的物件實例。把一個closure 物件賦值給一個變數的方式與普通變數賦值的語法是一樣的,最後也要加上分號:

 匿名函數變數賦值範例

<?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet(&#39;World&#39;);
$greet(&#39;PHP&#39;);
?>
登入後複製

閉包可以從父作用域繼承變數。任何此類變數都應該用 use 語言結構傳遞進去。 PHP 7.1 起,無法傳入此類變數: superglobals、 $this 或和參數重名。

從父作用域繼承變數

<?php
$message = &#39;hello&#39;;

// 没有 "use"
$example = function () {
    var_dump($message);
};
echo $example();

// 继承 $message
$example = function () use ($message) {
    var_dump($message);
};
echo $example();

// Inherited variable&#39;s value is from when the function
// is defined, not when called
$message = &#39;world&#39;;
echo $example();

// Reset message
$message = &#39;hello&#39;;

// Inherit by-reference
$example = function () use (&$message) {
    var_dump($message);
};
echo $example();

// The changed value in the parent scope
// is reflected inside the function call
$message = &#39;world&#39;;
echo $example();

// Closures can also accept regular arguments
$example = function ($arg) use ($message) {
    var_dump($arg . &#39; &#39; . $message);
};
$example("hello");
?>
登入後複製

以上例程的輸出類似於:

Notice: Undefined variable: message in /example.php on line 6
NULL
string(5) "hello"
string(5) "hello"
string(5) "hello"
string(5) "world"
string(11) "hello world"
登入後複製

這些變數都必須在函數或類別的頭部聲明。從父作用域繼承變數與使用全域變數是不同的。全域變數存在於一個全域的範圍,無論目前在執行的是哪個函數。而 閉包的父作用域是定義該閉包的函數(不一定是呼叫它的函數)。

Closures 與作用域範例:

<?php
// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。
// 其中有一个方法用来计算购物车中所有商品的总价格,该方法使
// 用了一个 closure 作为回调函数。
class Cart
{
    const PRICE_BUTTER  = 1.00;
    const PRICE_MILK    = 3.00;
    const PRICE_EGGS    = 6.95;

    protected   $products = array();
    
    public function add($product, $quantity)
    {
        $this->products[$product] = $quantity;
    }
    
    public function getQuantity($product)
    {
        return isset($this->products[$product]) ? $this->products[$product] :
               FALSE;
    }
    
    public function getTotal($tax)
    {
        $total = 0.00;
        
        $callback =
            function ($quantity, $product) use ($tax, &$total)
            {
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };
        
        array_walk($this->products, $callback);
        return round($total, 2);;
    }
}

$my_cart = new Cart;

// 往购物车里添加条目
$my_cart->add(&#39;butter&#39;, 1);
$my_cart->add(&#39;milk&#39;, 3);
$my_cart->add(&#39;eggs&#39;, 6);

// 打出出总价格,其中有 5% 的销售税.
print $my_cart->getTotal(0.05) . "\n";
// 最后结果是 54.29
?>
登入後複製

這篇文章就是匿名函數的介紹,希望對需要的朋友有幫助!

以上是什麼是匿名函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C++ 匿名函式的用法和特點 C++ 匿名函式的用法和特點 Apr 19, 2024 am 09:03 AM

匿名函數,又稱lambda表達式,是一種不指定名稱的函數,用於一次性使用或傳遞函數指標。特點有:匿名性、一次性使用、閉包、回傳類型推論。實戰中常用於排序或其他一次性函數呼叫。

Golang函數的匿名函數應用場景分析 Golang函數的匿名函數應用場景分析 May 16, 2023 pm 10:51 PM

作為一門現代化的程式語言,Golang(又稱Go語言)具有眾多強大的特性。其中,匿名函數是Golang的一個非常重要的概念,被廣泛應用於各種場景。在本文中,我們將深入分析Golang函數中匿名函數的應用場景。事件處理器在事件處理器中,匿名函數是一個非常方便且實用的工具。可以透過匿名函數向事件處理器傳遞自訂的邏輯,例如:funcmain(){bt

如何利用PHP7的匿名函數和閉包實現更靈活的程式碼邏輯處理? 如何利用PHP7的匿名函數和閉包實現更靈活的程式碼邏輯處理? Oct 21, 2023 am 10:21 AM

如何利用PHP7的匿名函數和閉包實現更靈活的程式碼邏輯處理?在PHP7之前,我們經常使用函數來封裝一段特定的邏輯,然後在程式碼中呼叫這些函數來實現特定的功能。然而,有時候我們可能需要在程式碼中定義一些臨時的邏輯塊,這些邏輯塊沒有必要創建一個獨立的函數,同時又不想在程式碼中引入太多的全域變數。 PHP7引入了匿名函數和閉包,可以很好地解決這個問題。匿名函數是一種沒有名

Golang 匿名函數可以傳回多個值嗎? Golang 匿名函數可以傳回多個值嗎? Apr 13, 2024 pm 04:09 PM

是的,Go語言中的匿名函數可以傳回多個值。語法:func(arg1,arg2,...,argN)(ret1,ret2,...,retM){//函數體}。使用方法:使用:=運算元接收回傳值;使用return關鍵字傳回多個值。

PHP8.0中的匿名函數 PHP8.0中的匿名函數 May 14, 2023 am 08:31 AM

PHP8.0是目前最新版本的PHP程式語言。一項重要的更新是對匿名函數的改進和增強。匿名函數(也稱為閉包)是一種特殊類型的函數,可以在運行時動態建立並傳遞給其他函數或儲存在變數中。在PHP中,匿名函數對於高階程式設計和Web開發至關重要。 PHP8.0提供了一些新的語法和功能,可以使匿名函數更加靈活和易於使用。其中一些更新如下:函數參數的類型聲明在PHP8.0中,

Python Lambda表達式:讓程式設計變得更輕鬆 Python Lambda表達式:讓程式設計變得更輕鬆 Feb 19, 2024 pm 09:54 PM

pythonLambda表達式是一個小的匿名函數,它可以將一個表達式儲存在變數中並傳回它的值。 Lambda表達式通常用於執行簡單的任務,這些任務可以透過編寫一個單獨的函數來完成,但Lambda表達式可以使程式碼更簡潔和易讀。 Lambda表達式的語法如下:lambdaarguments:expressionarguments是Lambda表達式接收的參數列表,expression是Lambda表達式的體,它包含需要執行的程式碼。例如,以下Lambda表達式將兩個數字相加並傳回它們的和:lambdax,

如何使用PHP7的匿名函數和閉包實現更靈活可重複使用的程式碼邏輯? 如何使用PHP7的匿名函數和閉包實現更靈活可重複使用的程式碼邏輯? Oct 24, 2023 am 10:30 AM

如何使用PHP7的匿名函數和閉包實現更靈活可重複使用的程式碼邏輯?在PHP程式設計領域中,匿名函數和閉包是非常有價值且強大的工具。 PHP7引入了一些新的語言特性,使得使用匿名函數和閉包更加方便和靈活。本文將介紹如何使用PHP7的匿名函數和閉包來實現更靈活和可重複使用的程式碼邏輯,並提供一些具體的程式碼範例。一、匿名函數匿名函數是一種沒有名稱的函數。在PHP中,可以將匿名

Python Lambda表達式:縮寫,簡潔,強大 Python Lambda表達式:縮寫,簡潔,強大 Feb 19, 2024 pm 08:10 PM

pythonLambda表達式是一個強大且靈活的工具,可用於建立簡潔、可讀且易於使用的程式碼。它們非常適合快速建立匿名函數,這些函數可以作為參數傳遞給其他函數或儲存在變數中。 Lambda表達式的基本語法如下:lambdaarguments:expression例如,以下Lambda表達式將兩個數字相加:lambdax,y:x+y這個Lambda表達式可以傳遞給另一個函數作為參數,如下所示:defsum( x,y):returnx+yresult=sum(lambdax,y:x+y,1,2)在這個例子

See all articles