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

PHP微框架飞行源码阅读——2.框架初始化、Loader、Dispatcher

时间:2023-03-29 15:53:36 PHP

自动加载完成后,通过new\flight\Engine()自动加载实例化下层框架的核心类Engine。这个类名字的翻译意思是engine引擎,就是飞行的发动机引擎,非常有想象力。publicstaticfunctionapp(){static$initialized=false;如果(!$initialized){require_once__DIR__.'/autoload.php';self::$engine=new\flight\Engine();$初始化=真;}returnself::$engine;}在实例化Engine类时,当前类的构造函数初始化框架。公共函数__construct(){$this->vars=array();$this->loader=newLoader();$this->dispatcher=newDispatcher();$this->init();}然后看init方法做了什么,将初始化状态标记为静态变量static$initialized,如果为true,则重置$this->vars和$this-中保存的属性>loader,$this->dispatcher到默认状态。静态$initialized=false;$self=$this;if($initialized){$this->vars=数组();$this->loader->reset();$this->dispatcher->reset();接下来,将框架的Request、Response、Router、View类的命名空间地址注册(设置)到Loader类的classes属性中。//注册默认组件$this->loader->register('request','\flight\net\Request');$this->loader->register('response','\flight\net\Response');$this->loader->register('router','\flight\net\Router');$this->loader->register('view','\flight\template\View',array(),函数($view)使用($self){$view->path=$self->get('flight.views.path');$view->extension=$self->get('flight.views.extension');});flight/core/Loader.phppublicfunctionregister($name,$class,array$params=array(),$callback=null){unset($this->instances[$name]);}$this->classes[$name]=array($class,$params,$callback);}接下来就是在调度器类Dispatcher的events属性中设置框架提供给用户的调用方式。//注册框架方法$methods=array('start','stop','route','halt','error','notFound','render','redirect','etag','lastModified','json','jsonp');foreach($methodsas$name){$this->dispatcher->set($name,array($this,'_'.$name));}flight/core/Dispatcher.php/***为事件分配回调。**@paramstring$name事件名称*@paramcallback$callback回调函数*/publicfunctionset($name,$callback){$this->events[$name]=$callback;}接下来就是设置框架的一些配置,并将这些配置保存在Engine类的vars属性中。//默认配置设置$this->set('flight.base_url',null);$this->set('flight.case_sensitive',false);$this->set('flight.handle_errors',true);$this->set('flight.log_errors',false);$this->set('flight.views.path','./views');$this->set('flight.views.extension','.php');flight/Engine.php/***设置一个变量。**@parammixed$key键*@paramstring$value值*/publicfunctionset($key,$value=null){if(is_array($key)||is_object($key)){foreach($key)作为$k=>$v){$this->vars[$k]=$v;}}else{$this->vars[$key]=$value;}}最后一步是在调用框架的start方法时设置一些前置操作,通过set_error_handler()和set_exception_handler()设置用户自定义的错误和异常处理函数。如何使用自定义错误和异常函数,可以看这两个例子:https://segmentfault.com/n/13…https://segmentfault.com/n/13…。//启动配置$this->before('start',function()use($self){//启用错误处理if($self->get('flight.handle_errors')){set_error_handler(array($self,'handleError'));set_exception_handler(array($self,'handleException'));}//设置区分大小写$self->router()->case_sensitive=$self->get('flight.case_sensitive');});$initialized=true;/***自定义错误处理程序。将错误转换为异常。**@paramint$errno错误号*@paramint$errstr错误字符串*@paramint$errfile错误文件名*@paramint$errline错误文件行号*@throws\ErrorException*/publicfunctionhandleError($errno,$errstr,$errfile,$errline){if($errno&error_reporting()){thrownew\ErrorException($errstr,$errno,0,$errfile,$errline);}}}/***自定义异常处理程序。记录异常。**@param\Exception$e抛出的异常*/publicfunctionhandleException($e){if($this->get('flight.log_errors')){error_log($e->getMessage());}$this->error($e);}当调用$self->router()时,会触发当前类的__call()魔术方法,$this->loader->get($name)会用于判断属性$classes中的路由索引是否存在,不存在则抛出异常。>loader->load($name,$shared)实例化初始化时设置的'\flight\net\Router',这里是工厂模式,后面的路由文章会详细分析/***处理对类方法的调用。**@paramstring$name方法名*@paramarray$params方法参数*@returnmixed回调结果*@throws\Exception*/publicfunction__call($name,$params){$callback=$this->dispatcher->得到($名称);如果(is_callable($callback)){返回$this->dispatcher->run($name,$params);}if(!$this->loader->get($name)){thrownew\Exception("{$name}必须是映射方法。");$shared=(!empty($params))?(bool)$params[0]:true;return$this->loader->load($name,$shared);}在$this->before()操作中,预操作会被设置到Dispatcher类的filters属性中。这些操作完成后,设置$initialized=true。/***向方法添加预过滤器。**@paramstring$name方法名*@paramcallback$callback回调函数*/publicfunctionbefore($name,$callback){$this->dispatcher->hook($name,'before',$callback);}flight/core/Dispatcher.php/***挂钩事件回调。**@paramstring$name事件名称*@paramstring$type过滤器类型*@paramcallback$callback回调函数*/publicfunctionhook($name,$type,$callback){$this->filters[$name][$type][]=$callback;}下一篇:phpmicroframeworkflight源码阅读——3.路由Router实现与执行过程php微框架flight源码阅读系列