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

[PHP] 理解依赖注入容器-自动注入,第1张

概述原文地址:PHP反射机制实现自动依赖注入-知乎(zhihu.com) 利用反射类获取类的对象,当有依赖其他类的时候,利用反射类获取到被依赖的对象,自动注入进来 A依赖B===>B依赖CclassC{publicfunction__construct(){}publicfunctiondoC(){ech

原文地址:

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] 理解依赖注入容器-自动注入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1000791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存