38287

38287

这家伙有点懒,还没写个性签名!

  • 财富值5
  • 威望值0
  • 总积分5

个人信息

  • 没人发现这 get() 有问题?

    首先 set() 很简单,经过 normalizeDefinition() 之后,definition 只有3种情况:
    1、匿名函数
    2、直接对象
    3、null / 字符串 / 数组,反正最终都会变成 class 这个键值(否则就出错)

    再来看 get($class),坑来了,参数 $class 对应的 definition 如果有,对应上面三种情况:
    1、call_user_func 可以拿到里面 new 出来的对象(至于这个对象还有依赖,可以 set() 时人为 get() 注入)
    2、这个不用说了,直接都是对象了(单例)
    3、通过 normalizeDefinition 我们知道,肯定有 class,并且 class 肯定是类名(这个是重点,一定是类名不是吗?!!!)

    再看 build($class) 干了什么事情:
    getDependencies() -> resolveDependencies() -> newInstanceArgs()
    直接把 $class 对应的这个类创建了出来,至于依赖,resolveDependencies 里面拿到 $class 构造函数的参数,直接 get 递归,反正到 newInstanceArgs 这一步,构造函数的参数要么是 get() 出来的真实依赖对象,要么是参数的简单类型的默认值。build 干了什么事?它直接产出了可用的真实对象,并且是解决并注入好依赖的!

    再看看 get() 里干了什么事?为了避免混淆,暂且把 definition 里面的 class 叫做 class,get() 参数第一个参数叫做 alias,它干了这么一件事:
    if ($class === $alias) {

    $object = $this->build($class, $params, $config);
    

    } else {

    $object = $this->get($concrete, $params, $config);
    

    }

    如果你还没看出坑,那就看流程:get('userLister'),原则上管它递归不递归它都应该是 app\models\UserLister 这个类的对象,难道不是直接 build('app\models\UserLister') ?但是因为 'userLister' !== 'app\models\UserLister',结果逻辑走向了:get('app\models\UserLister'),结果 get() 发现 definition('app\models\UserLister') 不存在,接着又回到了 build('app\models\UserLister'),啥玩意???逗我玩呢???

    原文是:http://www.digpage.com/di.html,这篇讲解其实是直接抄过来的(连图都抄没了),图请看原文,你会发现 get('app\models\UserLister') 最终还是走向了 build('app\models\UserLister'),只不过绕了一圈,至于为什么绕,要么是特殊情况,要么是写的人秀逗了?是薛强写的还是别人写的?

实习生 等级规则
5/20
资料完整度
0/100
用户活跃度
0/100

Ta的关注

0

Ta的粉丝

0

Ta的访客

0