• [PHP] 理解依赖注入容器-自动注入


    原文地址:

    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");

    开源作品

    GO-FLY,一套可私有化部署的免费开源客服系统,安装过程不超过五分钟(超过你打我 !),基于Golang开发,二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能
    github地址:go-fly
    官网地址:https://gofly.sopans.com

    赞赏作者

    微信交流

  • 相关阅读:
    深入浅出js单例模式
    前端常见面试-存储/缓存篇
    JavaScript内存管理
    delete操作符
    解决window.location.href跳转无效问题解决办法
    前端程序员经常忽视的一个JavaScript面试题
    【华为云技术分享】漫谈LiteOS-端云互通组件-MQTT开发指南(上)
    【华为云技术分享】序列特征的处理方法之二:基于卷积神经网络方法
    【华为云技术分享】原来CTR预估模型的发展有这样的规律
    【华为云技术分享】在家办公怎么弄?华为云DevCloud宝典一看就懂——项目管理篇
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14900972.html
Copyright © 2020-2023  润新知