丑话,这一章有难度,但也是框架的核心,大家静下心来学习吧。Dispatcher看一个概念分发器,英文叫dispather,它的主要作用是管理所有类的实例化操作(本质上类似于laravel的容器,当我们触发各种服务类时,会通过Dispatcher获取)。之前,我们使用new关键字来创建对象,比如入口文件中的newApplication(),Application类的构造函数中的newBootstrap()。如果有分销商,那就简单多了。在core目录下创建目录dispatcher,创建文件Dispatcher.php、Container.php、Box.php$cdorigin/core$mkdirdispatcher$cddispatcher$touchDispatcher.phpContainer.phpBox.phpDispatcher是一个抽象类定义了一个抽象方法getInstance(),用于获取子类实例。子类Container和Box分别继承了Dispatcher并实现了getInstance()方法。不同的是,该方法需要在容器中存放子类实例,实例化操作直接在盒子中进行。说白了就是每个类实例被触发调用后,会说把这个实例压入数组,下次调用的时候就不用重新实例化了。容器容器。容器中的实例可以复用盒子Box。盒子里的实例不能重复使用,每次都会创建一个新的实例Dispatcher类Dispatcher类的主要实现:定义抽象方法getInstance()abstractfunctiongetInstance();注意抽象方法必须用关键字abstract声明,不能包含函数体(花括号括起来的部分)接收所有静态方法请求__callStatic()publicstaticfunction__callstatic(string$method,array$args){//1$实例=static::getInstance();//2returncall_user_func_array(array($instance,$method),$args);}__callstatic这个方法的作用是你在其他文件中调用的不可见的静态方法会执行这个方法,所以它也是分销商。所有静态调用的不可见类方法都会执行这个函数,比如Config::get('db')。1.第一行static::getInstance();获取执行类的实例,需要分别在Container和Box中实现。2.通过call_user_func_array()调用自有方法,需要声明为protected,使用延迟静态绑定实例化子类publicstaticfunctionnewObject(){returnnewStatic;}这个函数的作用是实例化手术。在类Container和Box中调用,newStatic返回创建具体操作的子类的实例,如Config::get()返回Config类的实例,Router::start()返回路由器类。关于延迟静态绑定,非常重要。下面我继续讲。请耐心阅读类实例函数register()的定义publicstaticfunctionregister(){returnstatic::getInstance();}该函数获取子类实例。Register本质上是使用newStatic,但是register一般是外部的,比如我们在controller中获取某个类的实例,而newObject是内部的,具体实例化容器中的类。Container类Container类继承了Dispatcher,也实现了getInstance()方法。该类使用一个静态变量$container保存所有类实例,再次调用该实例时直接返回,无需实例化。EditContainer.php
