TP5.1類調用機制


tp5.1 類調用機制學習

<?php

namespace app\index\controller;

use think\facade\Debug;
class Index 
{
    public function index()
    {
        var_dump(Debug::dump(11));
    }
}

 

在Debug 類中 就一個方法

/**
 * 獲取當前Facade對應類名(或者已經綁定的容器對象標識)
 * @access protected
 * @return string
 */
public static function getFacadeClass()
{
    return 'debug';
}

 

​那么他是怎么做到加載Debug 類的呢

在父級類Facade 中使用了PHP的魔術方法__callStaic

當調用的類名不存在時就會調用該方法

// 調用實際類的方法

public static function __callStatic($method, $params)
{
    return call_user_func_array([static::createFacade(), $method], $params);
}

 

其中call_user_func_array() 中的 static::createFacede 返回值是當前要調用的對象(debug)

$method 是當前訪問的 方法(dump)

$params 為當前訪問所攜帶的參數數組(11)

createFacade方法具體如下

protected static function createFacade($class = '', $args = [], $newInstance = false)
{
    $class = $class ?: static::class;

    $facadeClass = static::getFacadeClass();

    if ($facadeClass) {
        $class = $facadeClass;
    } elseif (isset(self::$bind[$class])) {
        $class = self::$bind[$class];
    }
    if (static::$alwaysNewInstance) {
        $newInstance = true;
    }
    return Container::getInstance()->make($class, $args, $newInstance);
}

 

其中的$facadeClass已經通過 Debug類中的唯一的 方法getFacadeClass 返回  debug

return 通過Containner 容器類初始化(getInstance()) 創建(make)該類的實例

實例化之后 通過 call_user_func_array()傳入參數 調用

助手函數也是使用了該調用方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM