摘要:復制一個閉包,綁定指定的對象和類作用域。匿名函數目前是通過類來實現的。
通過幾個栗子認識PHP閉包
一、栗子1 用作于回調
二、栗子2 用作于變量賦值
三、栗子3 從父作用域繼承變量
四、栗子4的前提條件,簡單理解call_user_func_array()和call_user_func()方法
1. call_user_func — 把第一個參數作為回調函數調用
2. call_user_func_array — 調用回調函數,并把一個數組參數作為回調函數的參數
五、栗子4 綁定閉包在指定對象
1. Closure::bindTo — 復制當前閉包對象,綁定指定的$this對象和類作用域。
2. Closure::bind — 復制一個閉包,綁定指定的$this對象和類作用域。
六、參考資料
有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連
示例代碼
本文地址
本人能力有限,如遇到什么不對的地方還望指出修正,謝謝
所有栗子的輸出都使用symfony/var-dumpe美化了
匿名函數(Anonymous functions),也叫閉包函數(closures),允許 臨時創建一個沒有指定名稱的函數。最經常用作回調函數(callback)參數的值。當然,也有其它應用的情況。
匿名函數目前是通過 Closure 類來實現的。
一、栗子1 用作于回調$rs = preg_replace_callback("/-([a-z])/", function ($match) { return strtoupper($match[1]); }, "hello-world"); dump($rs); // "helloWorld"二、栗子2 用作于變量賦值
$greet = function ($name) { dump($name); }; dump($greet instanceof Closure); // true $greet("PHP"); // "PHP"三、栗子3 從父作用域繼承變量
$message = "hello"; $example = function () use ($message) { dump($message); }; dump($example instanceof Closure); // true $example(); // "hello"四、栗子4的前提條件,簡單理解call_user_func_array()和call_user_func()方法 1. call_user_func — 把第一個參數作為回調函數調用
function call_user_func ($function, ...$parameter) {}
該方法接收多個參數,第一個就是回調函數,可以是普通函數,也可以是閉包函數,后面的多個參數都是作為函數回調使用
$rs = call_user_func(function (...$params) { return func_get_args(); }, 1, 2, 3); dump($rs); // [1,2,3]2. call_user_func_array — 調用回調函數,并把一個數組參數作為回調函數的參數
function call_user_func_array ($function, array $param_arr) {}
該方法接收2個參數,第一個就是回調函數,可以是普通函數,也可以是閉包函數,后面的數組參數都是作為函數回調使用
$rs = call_user_func_array(function (array $params) { return func_get_args(); }, [1, 2, 3]); dump($rs); // [1,2,3]五、栗子4 綁定閉包在指定對象
樓主見解是將方法綁定到指定類上,使得方法也可以使用類的屬性和方法,非常適合配合__call()魔術方法和call_user_func_array方法一起使用
1. Closure::bindTo — 復制當前閉包對象,綁定指定的$this對象和類作用域。function bindTo($newthis, $newscope = "static") { }
1 && $arguments[0] instanceof Closure) { return call_user_func_array($arguments[0]->bindTo($this), array_slice($arguments, 1)); } throw new InvalidArgumentException("沒有這個方法"); } } // 測試 public function testClosureBindTo() { $obj = new ClosureBindTo(); $this->assertEquals(2, $obj->add(function (array $params) { return ++$params[0]; }, [1])); // 測試同一個實例 $newObj = $obj->test(function (array $params){ return $this; }, [1]); $this->assertTrue($newObj instanceof $obj); }2. Closure::bind — 復制一個閉包,綁定指定的$this對象和類作用域。
static function bind(Closure $closure, $newthis, $newscope = "static") { }
bind函數是bindTo的靜態表示
methods[$name] = Closure::bind($callback, $this, get_class()); } public function __call(string $name, array $arguments) { if (isset($this->methods[$name])) { return call_user_func_array($this->methods[$name], $arguments); } throw new RuntimeException("不存在方法[{$name}]"); } } // 測試 public function testClosureBind() { $obj = new ClosureBind(); $obj->addMethod("add", function (array $params) { return ++$params[0]; }); $this->assertEquals(2, $obj->add([1])); // 測試同一個實例 $obj->addMethod("test", function (array $params) { return $this; }); $this->assertTrue($obj->test([1]) instanceof $obj); }六、參考資料
php手冊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29847.html
摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
摘要:前言這段時間一直在消化作用域鏈和閉包的相關知識。而作用域鏈則是這套規則這套規則的具體運行。是變量對象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當前執行環境對符合訪問權限的變量和函數的有序訪問。 前言:這段時間一直在消化作用域鏈和閉包的相關知識。之前看《JS高程》和一些技術博客,對于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術文章。這也給我的學習上造成了一些困惑,...
摘要:圖片中的作用域鏈,是全局執行環境中的作用域鏈。然后此活動對象被推入作用域鏈的最前端。在最后調用的時候,創建先構建作用域鏈,再創建執行環境,再創建執行環境的時候發現了一個變量標識符。 從圖書館翻過各種JS的書之后,對作用域/執行環境/閉包這些概念有了一個比較清晰的認識。 栗子說明一切 第一個栗子 來看一個來自ECMA-262的栗子: var x = 10; (function foo(...
摘要:所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。所以本文中將以維基百科中的定義為準即在計算機科學中,閉包,又稱詞法閉包或函數閉包,是引用了自由變量的函數。 閉包(closure)是JavaScript中一個神秘的概念,許多人都對它難以理解,我也一直處于似懂非懂的狀態,前幾天深入了解了一下執行環境以及作用域鏈,可戳查看詳情,而閉包與作用域及作用域鏈的關系密不可分,所...
摘要:框架中就是使用服務容器來實現控制反轉和依賴注入。容器依賴注入的實現實現原理需要了解的知識點閉包匿名函數匿名函數,也叫閉包函數,允許臨時創建一個沒有指定名稱的函數反射以上版本具有完整的反射,添加了對類接口函數方法和擴展進行反向工程的能力。 前言 通過實現laravel 框架功能,以便深入理解laravel框架的先進思想。 什么是服務容器 服務容器是用來管理類依賴與運行依賴注入的工具。La...
閱讀 2744·2021-11-19 09:40
閱讀 5294·2021-09-27 14:10
閱讀 2099·2021-09-04 16:45
閱讀 1462·2021-07-25 21:37
閱讀 2994·2019-08-30 10:57
閱讀 2981·2019-08-28 17:59
閱讀 1055·2019-08-26 13:46
閱讀 1408·2019-08-26 13:27