介绍
这篇文章给大家分享的是有关使用容器类实现ThinkPHP核心框架的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
ThinkPHP的<代码> 代码>容器类提供了静态方法<代码>()代码>,可以根据类名或类的别名获取实例,会保持创建完成的实例,避免重复创建。下面实现这个方法,修改<代码>容器。php代码> ,添加以下代码。
//,,,,,*,ThinkPHP 5,与,6,在此处参数一致//,,,,,*,@param string 美元文摘//,,,,,*,@param array $ var//,,,,, *, @param bool newInstance美元//,,,,*/,,,public static function (string 抽象,美元,array vars 美元;=,[],,bool newInstance 美元;=,假) ,,,{ ,,,,,,,return 静态:getInstance()→使(抽象,美元,$ var, newInstance美元); ,,,}
编写<代码> getInstance() 代码>方法,并新增静态属性<代码> 代码实例美元保存自身实例。
protected static 实例美元;public static function getInstance () ,,,{ ,,,,,,,//,创建自身实例 ,,,,,,,if (is_null(静态:实例)美元),{ ,,,,,,,,,,,静态::$ instance =, new 静态; ,,,,,,,} ,,,,,,,return 静态::$实例; ,,,}
编写<代码>使()代码>方法。
public function make (string 抽象,美元,array vars 美元;=,[],,bool newInstance 美元;=,假) ,,,{ ,,,,,,,//,这里的,abstract 美元;是包含有命名空间的类名 ,,,,,,,if (收取($ this→绑定[摘要]美元)),{ ,,,,,,,,,,,abstract 美元;=,这→美元绑定[摘要]美元; ,,,,,,,} ,,,,,,,//,如果已经实例化直接返回 ,,,,,,,if (收取($ this→实例[摘要]美元),,,,! newInstance美元),{ ,,,,,,,,,,,return $ this→实例[摘要]美元; ,,,,,,,} ,,,,,,,//,如果就创建 ,,,,,,,object 美元;=,$ this→invokeClass($文摘,,$ var); ,,,,,,,//,保存实例 ,,,,,,,if (! $ newInstance), { ,,,,,,,这个→美元实例[摘要]美元,=,美元的对象; ,,,,,,,} ,,,,,,,return 美元对象; ,,,}
创建保存属性的别名数组绑定美元<代码> 代码>
,,,,protected bind 美元;=,( ,,,,,,,& # 39;应用# 39;,=祝辞,应用::类, ,,,,,,,& # 39;配置# 39;,=祝辞,配置::类, ,,,,,,,& # 39;请求# 39;,=祝辞;要求::类 ,,,,
编写<代码> invokeClass() 代码>方法
public function invokeClass (string 类,美元,array vars 美元;=,[]) ,,,{ ,,,,,,,//,vars 美元;为构造函数的参数 ,,,,,,,return new 美元类(); ,,,}
修改入口文件<代码>索引。php代码>
require __DIR__ 只& # 39;/. ./核心/base.php& # 39;; use 认为\请求;req 美元;=,\ \容器::获得(& # 39;请求# 39;);var_dump (req 美元;instanceof 请求);
输出bool(真正的)表示<代码>得到()代码>方法功能正常。
也可以利用魔术方法<代码> __get() 代码>和<代码> __set() 代码>,实现外部对象直接操作容器实例。
,,,,public function __get(抽象) ,,,{ ,,,,,,,//,返回容器的类实例 ,,,,,,,return $ this→使(文摘美元); ,,,}public function __set(抽象,美元,美元实例) ,,,{ ,,,,,,,if (收取($ this→绑定[摘要]美元)),{ ,,,,,,,,,,,abstract 美元;=,这→美元绑定[摘要]美元; null null null null使用容器类实现ThinkPHP核心框架的方法