博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
yii2 依赖注入探索
阅读量:6914 次
发布时间:2019-06-27

本文共 1506 字,大约阅读时间需要 5 分钟。

  hot3.png

当从容器中get一个类的实例时,容器Container需要解决的一个问题是依赖。

比如从容器中获取类A的实例,假如说类A依赖于类B,那么容器需要先获得B的实例,再实例化A。更多的依赖以此类推。

那么Yii是如何实现自动实例化依赖类的呢?

protected function getDependencies($class)    {        //.........        $dependencies = [];        $reflection = new ReflectionClass($class);        $constructor = $reflection->getConstructor();        if ($constructor !== null) {            foreach ($constructor->getParameters() as $param) {                if (version_compare(PHP_VERSION, '5.6.0', '>=') && $param->isVariadic()) {                    break;                } elseif ($param->isDefaultValueAvailable()) {                    $dependencies[] = $param->getDefaultValue();                } else {                    $c = $param->getClass();                    $dependencies[] = Instance::of($c === null ? null : $c->getName());                }            }        }        //........        return [$reflection, $dependencies];    }

1、获得构造函数 $reflection->getConstructor();

2、获取构造函数的参数 $constructor->getParameters();

3、如果参数不是可变参数(Variadic), 假如有默认值,那么就把默认值加入到dependencies数组中;如果没有默认值,那么就获取这个参数的类名 $param->getClass() (如果参数不是一个类,则返回null),然后不管是null还是具体的类名,都返回一个Instance类实例,这个Instance实例有一个属性id,值是$param->getClass();

4、返回dependencies数组,这个数组由我们要获取的类的构造函数的参数的默认值、参数的类名、null组成。顺序跟构造函数参数的顺序对应,因为如果你从容器中获取类的实例,如果传入$params,则依赖就改变了,以你传入的参数为准了。所以后面有一个覆盖的步骤。这个传入的$params为一个数组,里面是要传给构造函数的参数。

5、这就是覆盖咯

foreach ($params as $index => $param) {            $dependencies[$index] = $param;        }

 

转载于:https://my.oschina.net/sskill/blog/1583489

你可能感兴趣的文章
linux源地址转换(一)
查看>>
ZooKeeper客户端Curator使用一 创建连接
查看>>
图文说明虚拟机的几种网络模式
查看>>
将 instance 连接到 first_local_net - 每天5分钟玩转 OpenStack(82)
查看>>
Ubuntu屏幕截图快捷键知多少
查看>>
JQuery Select多选插件实现
查看>>
1-Ictclas50分词系统ForJava
查看>>
51CTO篮球俱乐部精彩集锦(5月9日)
查看>>
如何找到适合自己的学习方法
查看>>
Android 位置服务与GPS实时定位
查看>>
Nginx配置——用户认证
查看>>
SD卡分区及取消分区
查看>>
创建VLAN、中继链路和参与以太网捆绑的详细配置和截图
查看>>
健康的办公族作息时刻表
查看>>
新博客地址此博客不再更新baishuchao.github.io
查看>>
Git问题Everything up-to-date解决
查看>>
淘宝Tengine安装指南
查看>>
nginx-mysql-php安装配置
查看>>
div加链接 html给div加超链接实现点击div跳转的方法
查看>>
layer 旋转
查看>>