示例
<?php class RealRoute{ public function get(){ echo '获得我'; } }class Facade{ public static $resolvedInstance; public static $app; public static function __callStatic($method,$args){ $instance = static::getFacadeRoot(); if(!$instance){ throw new RuntimeException('A facade root has not been set.'); } return $instance->$method(...$args); } //获取Facade根对象 public static function getFacadeRoot() { return static::resolveFacadeInstance(static::getFacadeAccessor()); } protected static function resolveFacadeInstance($name){ if(is_object($name)){ return $name; } if (isset(static::$resolvedInstance[$name])) { return static::$resolvedInstance[$name]; } return static::$resolvedInstance[$name] = static::$app[$name]; } }class Router extends Facade{ protected static function getFacadeAccessor(){ return 'router'; }}class Container{ public $binding; public function bind($name,$obj){ $this->binding[$name] = $obj; } public function make($name,$args=[]){ call_user_func_array($name, $args); }}//step1:先加入服务容器/*$container = new Facade;$container->bind('router',function(){ return new RealRoute;})*/Router::$app['router']=new RealRoute;//step2:创建类别名class_alias('Router','Route');//step3:通过门面调用类方法Route::get();
其他
PHP 魔术方法 __call 与 __callStatic 方法
简单理解call_user_func和call_user_func_array两个函数
class_alias--为一个类创建别名