method_exists

ThinkPHP6应用程序初始化源代码分析

答应大家的,150粉丝福利安排进阶资料,工作中准备的,免费领取

应用程序构造

让我们看看__construct中做了些什么。基本上任何框架都会在这里做一些基本操作,也就是从这里扩展。

public function _ _ construct(string $ root path = & # 39;'){ $ this-& gt;thinkPath = dirname(__DIR__)。目录_分隔符;$ this-& gt;rootPath = $rootPath?rtrim($rootPath,DIRECTORY_SEPARATOR)。DIRECTORY _ SEPARATOR:$ this-& gt;getDefaultRootPath();$ this-& gt;app path = $ this-& gt;根路径。'app & # 39。目录_分隔符;$ this-& gt;runtime path = $ this-& gt;根路径。'运行时& # 39;。目录_分隔符;if(is _ file($ this-& gt;appPath。'provider.php & # 39)){ $ this-& gt;绑定(包括$ this-& gt;appPath。'provider.php & # 39);} static::set instance($ this);$ this-& gt;实例(& # 39;app & # 39,$这个);$ this-& gt;实例(& # 39;想想\\容器& # 39;,$这个);} ●从魔法的参数rootPath来看,支持自定义根目录路径。

●设置ThinkPath、RootPath、AppPath和运行时路径。

●默认服务提供者是绑定的,总共有两个,app\\Reques和app\\ExceptionHandle。其实你用的请求就是它。特定于appPath视图

●设置当前容器实例APP。

●将App($this)实例绑定到容器,即App和think\\Container。

这里需要注意的是,App类继承了容器,所以是把自己的实例绑定到容器上。

这里好像已经初始化了整个应用程序?这里我需要把Request run的一部分内容放在这里,因为那是框架的主要初始化工作,我觉得把这部分初始化工作放在Request run里不太合理。

面试10家公司,收获9个offer,2020年PHP 面试问题

主初始化

公共函数initialize(){ $ this-& gt;初始化=真;$ this-& gt;begin time = microtime(true);$ this-& gt;begin mem = memory _ get _ usage();//加载环境变量if(is _ file($ this->;根路径。'。env & # 39)){ $ this-& gt;env->;加载($ this-& gt;根路径。'。env & # 39);} $ this-& gt;config ext = $ this-& gt;env->;获取(& # 39;config _ ext & # 39, '。php & # 39);$ this-& gt;debugModeInit();//加载全局初始化文件$ this-& gt;load();//加载框架默认语言包$ langSet = $ this-& gt;郎-& gt;defaultLangSet();$ this-& gt;郎-& gt;加载($ this-& gt;thinkPath。'郎& # 39;。目录_分隔符。$langSet。'。php & # 39);//加载应用程序默认语言包$ this-& gt;loadLangPack($ langSet);//侦听AppInit $ this-& gt;事件->;触发器(& # 39;AppInit & # 39);date _ default _ time zone _ set($ this-& gt;配置-& gt;获取(& # 39;app.default _ timezone & # 39, '亚洲/上海& # 39;));//初始化foreach($ this-& gt;初始值设定项作为$ initializer){ $ this-& gt;make($ initializer)-& gt;init($ this);}返回$ this●加载。env环境变量文件。

●加载应用程序中的配置文件和文件。

●在应用程序中加载common.php。

●在thinkPath目录中加载helper函数的helper.php。

●加载配置文件

●在应用程序目录中加载event.php事件。

●在应用目录册service.php服务。

●加载语言包

●监听AppInit事件,可以用来做一些请求前的工作。

●设置时区。

注入所有服务并启动它们。

服务注册

在初始化过程中进行服务注册,那么服务注册是做什么的呢?如何使用服务?

公共函数注册($service,bool $ force = false){ $ registered = $ this-& gt;get service($ service);如果($注册&&!$ force){ return $ registered;} if(is _ string($ service)){ $ service = new $ service($ this);} if (method_exists($service,& # 39;注册& # 39;)){ $ service-& gt;寄存器();} if(property _ exists($service,& # 39;绑定& # 39;)){ $ this-& gt;绑定($ service->;绑定);} $ this-& gt;services[]= $ service;}●服务注册了吗?如有必要,必须重新注册。

●实例化服务

●如果实现了register方法,则需要执行register方法。

如果设置了bind属性,您需要将服务实例绑定到容器。

●最后融合到整个服务阵列中,等待引导。

服务启动

目前初始化时只有以下三个服务,在$ this->;在初始值设定项数组中

foreach($ this-& gt;初始值设定项作为$ initializer){ $ this-& gt;make($ initializer)-& gt;init($ this);}这三种服务是:

think \\ initializer \\ bootserviceink \\ initializer \\ Error think \\ initializer \\ register service●错误服务用于处理框架异常和错误。

● RegisterService字面意思是注册服务。

● BootService是启用服务。

错误处理将在后面讨论。这里说一下RegisterService和BootService。

当从容器创建RegisterService时。

有一个隐藏的静态方法make。每次第一次从容器中取得一个实例对象时都会执行make方法,当然,你必须先实现该方法。

然后执行Init方法。当您进入RegisterService时,您将看到这个方法。该方法的内容如下:

公共函数init(App $ App){ $ file = $ App-& gt;getRootPath()。'运行时& # 39;。目录_分隔符。'services.php & # 39;$ services = $ this-& gt;服务;if(is _ file($ file)){ $ services = array _ merge($ services,include $ file);} foreach($ services as $ service){ if(class _ exists($ service)){ $ app-& gt;注册(服务);}}}这个方法很奇怪,和我预想的有点不一样。服务是直接从运行时目录中获取的,而不是在config目录下的service.php中。为什么会这样?由于composer的开发,TP框架还可以提供自动包发现的功能,这也证明了开发团队在不断向社区靠拢。我们来看看是如何实现的。

因为这都是拜composer所赐,所以我们来看看rootPath下的composer.json。在底部,您会发现以下配置。

"脚本& # 34;: { "自动装载后转储& # 34;: [ "@ PHP think service:discover & # 34;, "@php think厂商:发布& # 34;]}从配置的角度来看,框架提供了两个指令,service:discover和vendor:publish。这里就不说具体实现了。你只需要知道包的发现是通过服务实现的:discover。

默认情况下,这里注入了三个服务。

Paginatorservice:: class,validateservice:: class,modelservice:: class,最后看BootService。这个很简单。从命名上看,不难看出下面是正常启动服务的代码,但这里需要注意的是,boot方法必须在service类中实现,才能启动。

公共函数init(App $ App){ $ App-& gt;boot();}以上是ThinkPHP6源代码分析的应用初始化细节。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论