匿名函數不是嚴格意義上的物件導向的特性,但它非常有用,因為可能會在使用回調物件導向的應用中遇到她。
請看以下兩個類別:
<?php class Product { public $name; public $price; function construct($name, $price) { $this->name = $name; $this->price= $price; } } class ProcessSale { private $callbacks; function register_callback($callback) { if(!is_callable($callback)) //判断是否可以调用 { throw new Exception('callback not callable'); } $this->callbacks[] = $callback; } function process($product) { print "{$product->name}: processing\n"; foreach($this->callbacks as $callback) { call_user_func($callback, $product); } } } ?>
這段程式碼的目的是執行各種回呼。 Product只儲存$name和$price。 Processsale由2個方法構成,registercallback()接受一個不提示的標量,測試該標量並將其加到回呼數組中。實作測試功能的內建函數is_callable()函數,該函數確保傳遞進來的值被call_user_func()或array_walk()等函數呼叫。
process()方法接受一個product對象,輸出與此物件有關的訊息。然後遍歷$callbacks數組屬性。
回呼的好處:利用回呼可以再運作時將與該元件的核心任務沒有直接關係的功能插入到元件中。有了元件回調,你就賦予了其他人在你不知道的上下文擴展你的程式碼的權利。
現在如果使用者想要建立一筆銷售記錄。如果該使用者可以直接存取該類,則可以在process()方法中新增記錄邏輯,但有時這種做法不好。如果他不是該類別的維護者,那麼她對該類別的修改會在下次更新時會覆蓋。即使他是該元件的維護者,想process()方法添加那麼多的附加任務也是本末倒置,無法體現該方法的核心功能,這可能導致該方法跨項目的可能性降低。
還好,我們創造了process回呼。
<?php class Product { public $name; public $price; function construct($name, $price) { $this->name = $name; $this->price= $price; } } class ProcessSale { private $callbacks; function register_callback($callback) { if(!is_callable($callback)) //判断是否可以调用 { throw new Exception('callback not callable'); } $this->callbacks[] = $callback; } function process($product) { print "{$product->name}: processing\n"; foreach($this->callbacks as $callback) { call_user_func($callback, $product); } } } $logger = create_function('$product', 'print " logging ({$product->name})\n";'); $p1 = new ProcessSale(); $p1->register_callback($logger); $p1->process(new Product("shoes", 8)); print "\n"; $p1->process(new Product("coffee", 9)); ?>
結果自行運作。
PHP 5.3及以後的版本中提供了更好的方法來實現匿名函數。
$logger = function($product) { print " logging ({$product->name})\n"; }; $p1 = new ProcessSale(); $p1->register_callback($logger); $p1->process(new Product("shoes", 8)); print "\n"; $p1->process(new Product("coffee", 9));
此方法是以內嵌的方式使用function關鍵字,且沒有函數名稱。注意,因為這是一條內聯語句,所以在程式碼區塊的末尾需要使用分號。
回呼不一定要匿名的,你可以使用函數名(甚至是物件參考和方法)作為回呼。
以上是php 的回呼與匿名函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!