原文地址:
PHP反射机制实现自动依赖注入 - 知乎 (zhihu.com)
利用反射类获取类的对象,当有依赖其他类的时候,利用反射类获取到被依赖的对象,自动注入进来
A依赖 B ===> B依赖C
class C{ public function __construct() { } public function doC(){ echo "C"; }}class B{ protected $c; public function __construct(C $c) { $this->c=$c; }}class A{ protected $b; public function __construct(B $b) { $this->b=$b; } public function doC(C $c){ $c->doC(); }}
使用反射类通过类名获取到被依赖的对象,直接通过构造函数或者类方法注入
/** * * 工具类,使用该类来实现自动依赖注入。 * */class Ioc { // 获得类的对象实例 public static function getInstance($classname) { $paramArr = self::getmethodParams($classname); return (new ReflectionClass($classname))->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; }}
$a=Ioc::getInstance("A");var_dump($a);Ioc::make("A","doC");
总结
以上是内存溢出为你收集整理的[PHP] 理解依赖注入容器-自动注入全部内容,希望文章能够帮你解决[PHP] 理解依赖注入容器-自动注入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)