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()傳入參數 調用
助手函數也是使用了該調用方式