当前位置: 首页 > 后端技术 > PHP

tp5源码分析之门面模式

时间:2023-03-30 06:14:47 PHP

含义Facade为容器中的类提供静态调用接口相比传统的静态方法调用,带来更好的可测试性和可扩展性前提条件熟悉容器,使用单例模式和注册树模式熟悉魔术方法__callStatis(),当调用非现有静态方法,执行代码主要集中在两个地方,thinkphp\library\think\Facade.php父类thinkphp\library\think\facade子类目录首先使用facade方式获取app配置场景分步分析\Config::get('应用程序');1、自动加载Config类入口文件加载base.php时,注册了类库别名Loader::addClassAlias(),其中Config=>facade\Config(base.php第36行),此时自动加载类是facade\ConfigTestdump(new\Config);打印内容对象(think\facade\Config)#34(0){}2.调用facadeConfig::Get()在facadeConfig及其父类Facade.php中找不到get()静态方法。此时会自动触发父类Facade.php中的魔术方法__callStatic()调用实际类的方法//call实际类的方法publicstaticfunction__callStatic($method,$params){returncall_user_func_array([static::createFacade(),$method],$params);}3.static::createFacade(),调用子类静态方法getFacadeClass,从facade\Config返回config,从容器中获取这个类实例/***创建Facade实例*@static*@accessprotected*@paramstring$class类名或标志*@param数组$args变量*@parambool$newInstance是不是每次创建新的实例*@returnobject*/protectedstaticfunctioncreateFacade($class='',$args=[],$newInstance=false){$class=$class?:static::class;$facadeClass=static::getFacadeClass();如果($facadeClass){$class=$facadeClass;}elseif(isset(self::$bind[$class])){$class=self::$bind[$class];}if(static::$alwaysNewInstance){$newInstance=true;}返回Container::getInstance()->make($class,$args,$newInstance);}

最新推荐
猜你喜欢