zoukankan      html  css  js  c++  java
  • [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

    赞赏作者

    微信交流

  • 相关阅读:
    Android中Context具体解释 ---- 你所不知道的Context
    JDK6、Oracle11g、Weblogic10 For Linux64Bit安装部署说明
    matplotlib 可视化 —— 定制 matplotlib
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 移动坐标轴(中心位置)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)
    指数函数的研究
    指数函数的研究
    指数分布的研究
  • 原文地址:https://www.cnblogs.com/taoshihan/p/14900972.html
Copyright © 2011-2022 走看看