[PHP] 理解依赖注入容器-自动注入
2023-02-18 15:37:29 时间
原文地址:
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报错“Primary script unknown”的解决方法
- [视频教程] ubuntu系统下安装最新版PHP7.3.X环境
- [操作系统]内存动态分区分配算法
- [操作系统]内存连续分配管理方式
- [视频教程] 如何在docker环境下的纯净ubuntu系统中安装最新版nginx
- [操作系统]内存覆盖与交换
- [操作系统]内存的基础知识
- 某业务自助开通账户问题排查
- [操作系统]处理机调度的概念和层次
- 将博客搬至CSDN
- 某业务付费统计脚本问题排查
- [操作系统]线程的概念和多线程模型
- [操作系统]进程通信
- [操作系统]进程的控制
- [PHP] 存储改造中的逻辑和清理遗留的问题
- [操作系统]进程的状态与转换
- [操作系统]进程的定义
- [PHP] 运维新增服务器导致的附件上传失败问题
- [PHP] 近期接手現有的企邮前端框架业务所遇困难
- [操作系统]操作系统中断机制