1. 程式人生 > >TP5.1類呼叫機制

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()傳入引數 呼叫

助手函式也是使用了該呼叫方式