[PHP] 理解依赖注入容器-自动注入
2023-02-18 15:41:26 时间
原文地址:
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]实体类基类和序列化__sleep问题
- [PHP]日志处理error_log()函数和配置使用
- [PHP] 使用反射实现的控制反转
- [PHP] debug_backtrace()可以获取到代码的调用路径追踪
- [TCP/IP] TCP的传输连接管理
- [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题
- [PHP] ubuntu下使用uuid扩展获取uuid
- [PHP] 装饰器模式-结构型设计模式
- [PHP] 数据映射器模式-结构型设计模式
- [PHP] MIME邮件协议的multipart类型
- [PHP] 组合模式-结构型设计模式
- [MySQL] mysql的逻辑分层
- [TCP/IP] 传输层-ethereal 抓包分析TCP包
- [TCP/IP] 传输层-TCP和UDP的使用场景
- [PHP] 桥接模式-结构型设计模式
- [TCP/IP] 网络层-简单查看路由表
- [PHP] 使用curl扩展POST或者PUT时数据不全和连接中断的排查
- [TCP/IP] 网络层-抓包分析IP数据包首部
- [TCP] TCP连接中的五个常见flag标志位
- [PHP] php使用curl扩展时的两个超时设置