TP5.1類呼叫機制
阿新 • • 發佈:2019-01-10
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 functiongetFacadeClass() { 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()傳入引數 呼叫
助手函式也是使用了該呼叫方式