国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel學(xué)習(xí)筆記之Callback Type

ChanceWong / 1420人閱讀

摘要:說明本文主要學(xué)習(xí)的回調(diào)類型通常在使用函數(shù)進(jìn)行回調(diào)時,如使用進(jìn)行回調(diào)時,需要傳入回調(diào),實際上有幾種的,在中也大量使用回調(diào),并根據(jù)場景不同傳入不同的回調(diào)類型。開發(fā)環(huán)境是把函數(shù)名作為類型傳進(jìn)去作為回調(diào)類型,形式如。

說明:本文主要學(xué)習(xí)PHP的回調(diào)類型callback type,通常在使用函數(shù)進(jìn)行回調(diào)時,如使用call_user_func($callback, $parameters)進(jìn)行回調(diào)時,需要傳入回調(diào)callback,實際上有幾種callback type的,在Laravel中也大量使用回調(diào),并根據(jù)場景不同傳入不同的回調(diào)類型。

開發(fā)環(huán)境:Laravel5.3 + PHP7

(Function/Static Class Method) Callback Type

Function Callback Type是把函數(shù)名作為callable類型傳進(jìn)去作為回調(diào)類型,形式如:($function_name, $dependency)。Static Class Method Callable Type與其類似,是把類名+靜態(tài)方法名傳進(jìn)去作為回調(diào)類型,形式如:("$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也是類名+靜態(tài)方法名,只不過形式稍不一樣,形式如:([$class_name, $method_name], $dependency)。Relation Class Method Callback Type是可以使用父類的方法傳進(jìn)去作為回調(diào),形式如:([$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是把對象方法作為參數(shù)傳進(jìn)去作為回調(diào),形式如:([$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作為參數(shù)傳進(jìn)去作為回調(diào)參數(shù)這種方式在Laravel中大量使用,比如Laravel的Pipeline源碼就大量使用這種方式,Pipeline的源碼可看:Laravel學(xué)習(xí)筆記之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;
            };
        };
    }
    

最后,給出整個源碼和測試結(jié)果:

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;
    }
}

總結(jié):本文主要總結(jié)下PHP的Callback Type,便于提高自己的代碼設(shè)計能力。遇到好的技術(shù)再聊,到時見。

歡迎關(guān)注Laravel-China。

RightCapital招聘Laravel DevOps

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30472.html

相關(guān)文章

  • Laravel學(xué)習(xí)筆記Schema Builder 和 Migration System(上)

    摘要:看下兩個方法的源碼同樣是使用了對象來添加命令和。 說明:本文主要學(xué)習(xí)Schema Builder和Migration System的使用及相關(guān)原理。傳統(tǒng)上在設(shè)計database時需要寫大量的SQL語句,但Laravel提供了Schema Builder這個神器使得在設(shè)計database時使用面向?qū)ο蠓椒▉碜觯恍枰獙懸恍蠸QL,并且還提供了另一個神器Migration System,可...

    nevermind 評論0 收藏0
  • Laravel 學(xué)習(xí)筆記 Query Builder 源碼解析(下)

    摘要:,看下源碼返回很容易知道返回值是,然后將該值存儲在變量中,這時。看下的源碼去除掉字符后為返回從源碼中可知道返回值為,這時。 說明:本文主要學(xué)習(xí)下Query Builder編譯Fluent Api為SQL的細(xì)節(jié)和執(zhí)行SQL的過程。實際上,上一篇聊到了IlluminateDatabaseQueryBuilder這個非常重要的類,這個類含有三個主要的武器:MySqlConnection, M...

    qpal 評論0 收藏0
  • Laravel學(xué)習(xí)筆記IoC Container實例化源碼解析

    摘要:說明本文主要學(xué)習(xí)容器的實例化過程,主要包括等四個過程。看下的源碼如果是數(shù)組,抽取別名并且注冊到中,上文已經(jīng)討論實際上就是的。 說明:本文主要學(xué)習(xí)Laravel容器的實例化過程,主要包括Register Base Bindings, Register Base Service Providers , Register Core Container Aliases and Set the ...

    ningwang 評論0 收藏0
  • Laravel學(xué)習(xí)筆記函數(shù)處理(Function Handling)

    摘要:提供了一些函數(shù)處理操作的內(nèi)置函數(shù),主要有開發(fā)環(huán)境是調(diào)用回調(diào)函數(shù),并把一個數(shù)組作為參數(shù)傳進(jìn)去作為回調(diào)函數(shù)的參數(shù)也是調(diào)用回調(diào)函數(shù),區(qū)別是并沒有要求把數(shù)組作為參數(shù)傳進(jìn)回調(diào)函數(shù)做參數(shù)。 說明:Laravel中經(jīng)常使用PHP的Function Handling來設(shè)計代碼,本文主要學(xué)習(xí)PHP的Function Handling特性,來提高寫代碼時的設(shè)計質(zhì)量。PHP提供了一些函數(shù)處理操作的內(nèi)置函數(shù),...

    Rindia 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Filesystem源碼解析(上)

    摘要:說明本文主要學(xué)習(xí)的模塊的源碼邏輯,把自己的一點點研究心得分享出來,希望對別人有所幫助。實際上,使用了的重載學(xué)習(xí)筆記之重載,通過魔術(shù)方法調(diào)用里的,而這個實際上就是,該中有方法,可以調(diào)用。 說明:本文主要學(xué)習(xí)Laravel的Filesystem模塊的源碼邏輯,把自己的一點點研究心得分享出來,希望對別人有所幫助。總的來說,F(xiàn)ilesystem模塊的源碼也比較簡單,Laravel的Illumi...

    AlphaGooo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<