加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP基于反射机制实现自动依靠注入的要领详解

发布时间:2021-03-31 11:43:42 所属栏目:编程 来源:网络整理
导读:本篇章节讲授PHP基于反射机制实现自动依靠注入的要领。供各人参考研究详细如下: 依靠注入又叫节制反转,行使过框架的人应该都不生疏。许多人一看名字就认为长短常高峻上的对象,就对它望而却步,本日抽闲研究了下,解开他它的隐秘面纱。空话不多

本篇章节讲授PHP基于反射机制实现自动依靠注入的要领。分享给各人供各人参考,详细如下:

依靠注入又叫节制反转,行使过框架的人应该都不生疏。许多人一看名字就认为长短常高峻上的对象,就对它望而却步,本日抽闲研究了下,解开他它的隐秘面纱。空话不多说,直接上代码;

newInstanceArgs($paramArr); } /** * 执行类的要领 * @param [type] $className [类名] * @param [type] $methodName [要领名称] * @param [type] $params [特另外参数] * @return [type] [description] */ public static function make($className,$methodName,$params = []) { // 获取类的实例 $instance = self::getInstance($className); // 获取该要领所必要依靠注入的参数 $paramArr = self::getMethodParams($className,$methodName); return $instance->{$methodName}(...array_merge($paramArr,$params)); } /** * 得到类的要领参数,只得到有范例的参数 * @param [type] $className [description] * @param [type] $methodsName [description] * @return [type] [description] */ protected static function getMethodParams($className,$methodsName = '__construct') { // 通过反射得到该类 $class = new ReflectionClass($className); $paramArr = []; // 记录参数,和参数范例 // 判定该类是否有结构函数 if ($class->hasMethod($methodsName)) { // 得到结构函数 $construct = $class->getMethod($methodsName); // 判定结构函数是否有参数 $params = $construct->getParameters(); if (count($params) > 0) { // 判定参数范例 foreach ($params as $key => $param) { if ($paramClass = $param->getClass()) { // 得到参数范例名称 $paramClassName = $paramClass->getName(); // 得到参数范例 $args = self::getMethodParams($paramClassName); $paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args); } } } } return $paramArr; } }

上面的代码行使php的反射函数,建设了一个容器类,行使该类来实现其他类的依靠注入成果。上面的依靠注入分为两种,一种是结构函数的依靠注入,一种是要领的依靠注入。 我们行使下面三个类来做下测试。

cObj = $c; } public function aa() { echo 'this is A->test'; } public function aac() { $this->cObj->cc(); } } class B { protected $aObj; /** * 测试结构函数依靠注入 * @param A $a [行使引来注入A] */ public function __construct(A $a) { $this->aObj = $a; } /** * [测试要领挪用依靠注入] * @param C $c [依靠注入C] * @param string $b [这个是本技艺动填写的参数] * @return [type] [description] */ public function bb(C $c,$b) { $c->cc(); echo "rn"; echo 'params:' . $b; } /** * 验证依靠注入是否乐成 * @return [type] [description] */ public function bbb() { $this->aObj->aac(); } } class C { public function cc() { echo 'this is C->cc'; } }

测试结构函数的依靠注入

bbb(); // 输出:this is C->cc , 声名依靠注入乐成。 // 打印$bObj var_dump($bObj); // 打印功效,可以看出B中有A实例,A中有C实例,声名依靠注入乐成。 object(B)#3 (1) { ["aObj":protected]=> object(A)#7 (1) { ["cObj":protected]=> object(C)#10 (0) { } } }

测试要领依靠注入

cc params:this is param b

从上面两个例子可以看出我们建设工具可能挪用要领时,基础就不消知道该类或该要领依靠了谁人类。行使反射机制可以轻松的为我们自动注入所必要的类。

总结

好了,看到上面的代码是不是认为很简朴,着实只要认识php的反射机制,依靠注入并不难实现,上面的代码为了利便领略,以是写的简朴除暴,在现实的项目中必定不会这么简朴,好比:会对注入的类和参数举办设置,好比会缓存实例化过的类,下次必要该类的实例时,可以直接行使,而不消在从头初始化,等等。不外信托道理相识了,其他的可以跟着项目标需求本身去完美。

更多关于PHP相干内容感乐趣的读者可查察本站专题:《》、《》、《》、《》、《》、《》、《》及《》

但愿本文所述对各人PHP措施计划有所辅佐。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读