成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel學(xué)習(xí)筆記之函數(shù)處理(Function Handling)

Rindia / 2670人閱讀

摘要:提供了一些函數(shù)處理操作的內(nèi)置函數(shù),主要有開(kāi)發(fā)環(huán)境是調(diào)用回調(diào)函數(shù),并把一個(gè)數(shù)組作為參數(shù)傳進(jìn)去作為回調(diào)函數(shù)的參數(shù)也是調(diào)用回調(diào)函數(shù),區(qū)別是并沒(méi)有要求把數(shù)組作為參數(shù)傳進(jìn)回調(diào)函數(shù)做參數(shù)。

說(shuō)明:Laravel中經(jīng)常使用PHP的Function Handling來(lái)設(shè)計(jì)代碼,本文主要學(xué)習(xí)PHP的Function Handling特性,來(lái)提高寫代碼時(shí)的設(shè)計(jì)質(zhì)量。PHP提供了一些函數(shù)處理操作的內(nèi)置函數(shù),主要有:

call_user_func_array( )

call_user_func( )

func_get_arg( )

func_get_args( )

func_num_args( )

function_exists( )

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

Function Handling call_user_func_array()/call_user_func()

call_user_func_array()是調(diào)用回調(diào)函數(shù),并把一個(gè)數(shù)組作為參數(shù)傳進(jìn)去作為回調(diào)函數(shù)的參數(shù);call_user_func()也是調(diào)用回調(diào)函數(shù),區(qū)別是并沒(méi)有要求把數(shù)組作為參數(shù)傳進(jìn)回調(diào)函數(shù)做參數(shù)。在Laravel中大量使用這兩個(gè)內(nèi)置函數(shù)來(lái)設(shè)計(jì)代碼,比如IlluminateFoundationApplication::fireAppCallbacks()的源碼:

    /**
     * Call the booting callbacks for the application.
     *
     * @param  array  $callbacks
     * @return void
     */
    protected function fireAppCallbacks(array $callbacks)
    {
        foreach ($callbacks as $callback) {
            call_user_func($callback, $this); //執(zhí)行回調(diào)函數(shù),并把Application對(duì)象作為參數(shù)傳進(jìn)去
        }
    }

call_user_func()和call_user_func_array()可以說(shuō)是PHP設(shè)計(jì)好代碼的神器,不得不熟悉,這里給下它的PHPUnit測(cè)試看看如何使用,爆綠燈:

assertSame("This is a service provider.", $actual);
    }

    public function testCallUserFuncArray()
    {
        // Arrange
        $provider = new Provider();
        $app      = new Application($provider);

        // Actual
        $actual = call_user_func_array("MyRightCapitalContainerTestscallUserFunc", [$app]);

        // Assert
        $this->assertSame("This is a service provider.", $actual);
    }
}

function callUserFunc($app)
{
    return $app->register();
}

class Application
{
    private $provider;

    public function __construct($provider)
    {
        $this->provider = $provider;
    }

    public function register()
    {
        return $this->provider->register();
    }
}

class Provider
{
    public function register()
    {
        return "This is a service provider.";
    }
}

call_user_func_array()和call_user_func()真是個(gè)非常用的函數(shù),值得在設(shè)計(jì)自己的代碼里使用。

func_get_arg()/func_get_args()/func_num_args()

func_get_arg()是從函數(shù)的參數(shù)列表讀取某個(gè)指定的參數(shù),func_get_args()是讀取函數(shù)的整個(gè)參數(shù)列表作為數(shù)組返回,func_num_args()是讀取函數(shù)的參數(shù)的個(gè)數(shù)。Laravel中的IlluminateFoundationApplication::environment()使用了這三個(gè)函數(shù)來(lái)設(shè)計(jì)代碼,很巧妙:

    /**
     * Get or check the current application environment.
     *
     * @return string|bool
     */
    public function environment()
    {    
        // 如果傳入了參數(shù)
        if (func_num_args() > 0) {
            // 如果第一個(gè)參數(shù)是數(shù)組形式就把該數(shù)組賦值給$patterns;如果不是就把所有參數(shù)作為一個(gè)數(shù)組賦值給$patterns
            $patterns = is_array(func_get_arg(0)) ? func_get_arg(0) : func_get_args();

            foreach ($patterns as $pattern) {
                if (Str::is($pattern, $this["env"])) {
                    return true;
                }
            }

            return false;
        }

        return $this["env"];
    }

看environment()源碼可知道environment()是可以傳入?yún)?shù)的,如果不傳入?yún)?shù)就返回$this["env"]的值即Laravel中的環(huán)境變量APP_ENV值,如App::environment()即為讀取Laravel當(dāng)前運(yùn)行環(huán)境變量值;如果傳入?yún)?shù)則判斷該值是否與環(huán)境變量值相等,如App::environment("production","staging", "development")即判斷當(dāng)前Laravel運(yùn)行環(huán)境是否是"production","staging", "development"中的一種。很巧妙的設(shè)計(jì)。

這里寫個(gè)PHPUnit測(cè)試下,爆綠燈:

class FunctionHandling extends PHPUnit_Framework_TestCase
{
    public function testFuncArgs()
    {
        // Arrange
        $provider = new Provider();
        $app      = new Application($provider);
        
        // Actual
        $arg_number0 = $app->testFuncArg(); 
        $arg_number1 = $app->testFuncArg("Laravel");
        $arg_number2 = $app->testFuncArg(["Laravel", "PHP"]);
        
        // Assert
        $this->assertSame(0, $arg_number0);
        $this->assertSame(1, $arg_number1);
        $this->assertSame(2, $arg_number2);
    }
}

class Application
{
    private $provider;

    public function __construct($provider)
    {
        $this->provider = $provider;
    }

    public function register()
    {
        return $this->provider->register();
    }

    public function testFuncArg()
    {
        if (func_num_args() > 0) {
            $patterns = is_array(func_get_arg(0)) ? func_get_arg(0) :func_get_args();
            return count($patterns);
        }
        
        return 0;
    }
}
 
function_exists()

function_exists()判斷指定函數(shù)是否已經(jīng)定義,這個(gè)函數(shù)在Laravel中大量使用,尤其是造輔助函數(shù)時(shí)使用,參考Illuminate/Foundation/helpers.php,
Illuminate/Support/helpers.php。這里做個(gè)PHPUnit測(cè)試,爆綠燈:

class FunctionHandling extends PHPUnit_Framework_TestCase
{
    public function testFunctionExists()
    {
        // Arrange
        $expected = "Container";

        // Actual
        $actual = functionExists("Container");

        // Assert
        $this->assertSame($expected, $actual);
    }
}
        
if (!function_exists("functionExists")) {
    function functionExists($container)
    {
        return $container;
    }
}
    

總結(jié):本文主要學(xué)習(xí)了PHP的Function Handling,這個(gè)技術(shù)可以用來(lái)提高自己的代碼設(shè)計(jì)能力,同時(shí)Laravel中也大量使用了這個(gè)技術(shù)來(lái)巧妙設(shè)計(jì)代碼。下次遇到好的技術(shù)在分享,到時(shí)見(jiàn)。

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

RightCapital招聘Laravel DevOps

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30473.html

相關(guān)文章

  • Laravel學(xué)習(xí)筆記Middleware源碼解析

    摘要:學(xué)習(xí)筆記之已經(jīng)聊過(guò)使用了來(lái)設(shè)計(jì),看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來(lái)設(shè)計(jì)。開(kāi)發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個(gè)內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實(shí)例化源碼解析已經(jīng)聊過(guò)的實(shí)例化,得到中的變量,即的實(shí)例化對(duì)象。后面再學(xué)習(xí)下的源碼,到時(shí)見(jiàn)。 說(shuō)明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計(jì)思想,并將學(xué)習(xí)心得分享出來(lái),希望對(duì)別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...

    _Dreams 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記bootstrap源碼解析

    摘要:總結(jié)本文主要學(xué)習(xí)了啟動(dòng)時(shí)做的七步準(zhǔn)備工作環(huán)境檢測(cè)配置加載日志配置異常處理注冊(cè)注冊(cè)啟動(dòng)。 說(shuō)明:Laravel在把Request通過(guò)管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動(dòng)Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動(dòng)程序做了哪些具體工作,并將個(gè)人的研究心得分享出來(lái),希望對(duì)別人有所幫助。Laravel在入口index...

    xiaoxiaozi 評(píng)論0 收藏0
  • Laravel 學(xué)習(xí)筆記 Query Builder 源碼解析(中)

    說(shuō)明:本篇主要學(xué)習(xí)數(shù)據(jù)庫(kù)連接階段和編譯SQL語(yǔ)句部分相關(guān)源碼。實(shí)際上,上篇已經(jīng)聊到Query Builder通過(guò)連接工廠類ConnectionFactory構(gòu)造出了MySqlConnection實(shí)例(假設(shè)驅(qū)動(dòng)driver是mysql),在該MySqlConnection中主要有三件利器:IlluminateDatabaseMysqlConnector;IlluminateDatabaseQuery...

    zhou_you 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記Callback Type

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

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

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

    qpal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<