摘要:說明本文主要學習的回調類型通常在使用函數進行回調時,如使用進行回調時,需要傳入回調,實際上有幾種的,在中也大量使用回調,并根據場景不同傳入不同的回調類型。開發環境是把函數名作為類型傳進去作為回調類型,形式如。
說明:本文主要學習PHP的回調類型callback type,通常在使用函數進行回調時,如使用call_user_func($callback, $parameters)進行回調時,需要傳入回調callback,實際上有幾種callback type的,在Laravel中也大量使用回調,并根據場景不同傳入不同的回調類型。
開發環境:Laravel5.3 + PHP7
(Function/Static Class Method) Callback TypeFunction Callback Type是把函數名作為callable類型傳進去作為回調類型,形式如:($function_name, $dependency)。Static Class Method Callable Type與其類似,是把類名+靜態方法名傳進去作為回調類型,形式如:("$class_name::$static_method_name", $dependency)。看下PHPUnit測試,看看如何使用callback type,爆綠燈:
assertSame($expected, $actual); } public function testStaticClassMethodCallback() { // Arrange $expected = "container"; // Actual $actual = call_user_func("MyRightCapitalContainerTestsStaticClassMethodCallback::staticClassMethod", "container"); // ("$class_name::$static_method_name", $dependency) // Assert $this->assertSame($expected, $actual); } } function functionCallback($app) { return $app; } class StaticClassMethodCallback { public static function staticClassMethod($app) { return $app; } }(Class Method/Relation Class Method) Callback Type
Class Method Callback Type也是類名+靜態方法名,只不過形式稍不一樣,形式如:([$class_name, $method_name], $dependency)。Relation Class Method Callback Type是可以使用父類的方法傳進去作為回調,形式如:([$class_name, "parent::$method_name"], $dependency)。寫個PHPUnit測試看下使用:
public function testClassMethodCallback() { // Arrange $expected = "container"; // Actual $actual = call_user_func([ClassMethodCallback::class, "classMethod"], "container"); // ([$class_name, $method_name], $dependency) // Assert $this->assertSame($expected, $actual); } public function testRelationClassMethodCallback() { // Arrange $expected = "container/container"; // Actual $actual = call_user_func([ClassMethodCallback::class, "parent::classMethod"], "container"); // ([$class_name, "parent::$method_name"], $dependency) // Assert $this->assertSame($expected, $actual); } class ClassMethodCallback extends ParentClassMethodCallback { public static function classMethod($app) { return $app; } } class ParentClassMethodCallback { public static function classMethod($app) { return $app . "/" . $app; } }Object Method Callback Type
Object Method Callback Type是把對象方法作為參數傳進去作為回調,形式如:([$object, $method_name], $dependency),寫個PHPUnit測試:
public function testObjectMethodCallback() { // Arrange $class_method_callback = new ClassMethodCallback(); $expected = "container"; // Actual $actual = call_user_func([$class_method_callback, "objectMethod"], "container"); // ([$object, $method_name], $dependency) // Assert $this->assertSame($expected, $actual); } class ClassMethodCallback extends ParentClassMethodCallback { public static function classMethod($app) { return $app; } public function objectMethod($app) { return $app; } }Closure
把Closure作為參數傳進去作為回調參數這種方式在Laravel中大量使用,比如Laravel的Pipeline源碼就大量使用這種方式,Pipeline的源碼可看:Laravel學習筆記之Middleware源碼解析。寫下PHPUnit測試看下:
public function testClosureCallback() { // Arrange // Actual $actual = call_user_func(getClosure(), "stack", "pipe"); $actual_value = call_user_func($actual, "request"); // Assert $this->assertInstanceOf(Closure::class, $actual); $this->assertSame("request/stack/pipe", $actual_value); } function getClosure() { return function ($stack, $pipe) { return function ($passable) use ($stack, $pipe) { return $passable . "/" . $stack . "/" . $pipe; }; }; }
最后,給出整個源碼和測試結果:
assertSame($expected, $actual); } public function testStaticClassMethodCallback() { // Arrange $expected = "container"; // Actual $actual = call_user_func("MyRightCapitalContainerTestsStaticClassMethodCallback::staticClassMethod", "container"); // ("$class_name::$static_method_name", $dependency) // Assert $this->assertSame($expected, $actual); } public function testClassMethodCallback() { // Arrange $expected = "container"; // Actual $actual = call_user_func([ClassMethodCallback::class, "classMethod"], "container"); // ([$class_name, $method_name], $dependency) // Assert $this->assertSame($expected, $actual); } public function testRelationClassMethodCallback() { // Arrange $expected = "container/container"; // Actual $actual = call_user_func([ClassMethodCallback::class, "parent::classMethod"], "container"); // ([$class_name, "parent::$method_name"], $dependency) // Assert $this->assertSame($expected, $actual); } public function testObjectMethodCallback() { // Arrange $class_method_callback = new ClassMethodCallback(); $expected = "container"; // Actual $actual = call_user_func([$class_method_callback, "objectMethod"], "container"); // ([$object, $method_name], $dependency) // Assert $this->assertSame($expected, $actual); } public function testClosureCallback() { // Arrange // Actual $actual = call_user_func(getClosure(), "stack", "pipe"); $actual_value = call_user_func($actual, "request"); // Assert $this->assertInstanceOf(Closure::class, $actual); $this->assertSame("request/stack/pipe", $actual_value); } } function getClosure() { return function ($stack, $pipe) { return function ($passable) use ($stack, $pipe) { return $passable . "/" . $stack . "/" . $pipe; }; }; } function functionCallback($app) { return $app; } class StaticClassMethodCallback { public static function staticClassMethod($app) { return $app; } } class ClassMethodCallback extends ParentClassMethodCallback { public static function classMethod($app) { return $app; } public function objectMethod($app) { return $app; } } class ParentClassMethodCallback { public static function classMethod($app) { return $app . "/" . $app; } }
總結:本文主要總結下PHP的Callback Type,便于提高自己的代碼設計能力。遇到好的技術再聊,到時見。
歡迎關注Laravel-China。
RightCapital招聘Laravel DevOps
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30472.html
摘要:看下兩個方法的源碼同樣是使用了對象來添加命令和。 說明:本文主要學習Schema Builder和Migration System的使用及相關原理。傳統上在設計database時需要寫大量的SQL語句,但Laravel提供了Schema Builder這個神器使得在設計database時使用面向對象方法來做,不需要寫一行SQL,并且還提供了另一個神器Migration System,可...
摘要:,看下源碼返回很容易知道返回值是,然后將該值存儲在變量中,這時。看下的源碼去除掉字符后為返回從源碼中可知道返回值為,這時。 說明:本文主要學習下Query Builder編譯Fluent Api為SQL的細節和執行SQL的過程。實際上,上一篇聊到了IlluminateDatabaseQueryBuilder這個非常重要的類,這個類含有三個主要的武器:MySqlConnection, M...
摘要:說明本文主要學習容器的實例化過程,主要包括等四個過程。看下的源碼如果是數組,抽取別名并且注冊到中,上文已經討論實際上就是的。 說明:本文主要學習Laravel容器的實例化過程,主要包括Register Base Bindings, Register Base Service Providers , Register Core Container Aliases and Set the ...
摘要:提供了一些函數處理操作的內置函數,主要有開發環境是調用回調函數,并把一個數組作為參數傳進去作為回調函數的參數也是調用回調函數,區別是并沒有要求把數組作為參數傳進回調函數做參數。 說明:Laravel中經常使用PHP的Function Handling來設計代碼,本文主要學習PHP的Function Handling特性,來提高寫代碼時的設計質量。PHP提供了一些函數處理操作的內置函數,...
摘要:說明本文主要學習的模塊的源碼邏輯,把自己的一點點研究心得分享出來,希望對別人有所幫助。實際上,使用了的重載學習筆記之重載,通過魔術方法調用里的,而這個實際上就是,該中有方法,可以調用。 說明:本文主要學習Laravel的Filesystem模塊的源碼邏輯,把自己的一點點研究心得分享出來,希望對別人有所幫助。總的來說,Filesystem模塊的源碼也比較簡單,Laravel的Illumi...
閱讀 923·2021-11-22 13:54
閱讀 2851·2021-09-28 09:36
閱讀 2989·2019-08-30 15:55
閱讀 1957·2019-08-30 15:44
閱讀 551·2019-08-29 12:31
閱讀 2568·2019-08-28 18:18
閱讀 1207·2019-08-26 13:58
閱讀 1393·2019-08-26 13:44