在 magento 2 中,类是使用对象管理器工厂实例化的: \Magento\Framework\ObjectManager\Factory\Factory::create().
到目前为止一切顺利。但这里有一些我不明白的事情。
检查参数中是否没有循环引用后,应传递给 DI 的构造函数,并且在确定参数后,有以下内容 ($args 是应该传递给构造函数的参数):

    switch (count($args)) {
        case 1:
            return new $type($args[0]);
        case 2:
            return new $type($args[0], $args[1]);
        case 3:
            return new $type($args[0], $args[1], $args[2]);
        case 4:
            return new $type($args[0], $args[1], $args[2], $args[3]);
        case 5:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4]);
        case 6:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
        case 7:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]);
        case 8:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]);
        default:
            $reflection = new \ReflectionClass($type);
            return $reflection->newInstanceArgs($args);
    }

为什么这么长 switch 陈述?为什么不直接使用代码 default 分支?
或者为什么要停止 case 在8点?为什么不是 5、10 或 127?

有帮助吗?

解决方案

原因是性能。通过new实例化比反射稍快一些。大多数类的参数少于 8 个,因此此开关涵盖了大多数情况。

也许它会被删除。

其他提示

性能提升几乎是看不见的。当我尝试使用 2 种方法实例化 1000000 个对象时,结果如下:

enter image description here

我正在使用 Magento 2 Beta 和 PHP 版本(见下文)

PHP 5.6.12-1+deb.sury.org〜Trusty+1(CLI)版权(C)1997-2015 PHP Group Zend Engine v2.6.0,版权(c)1998-2015带有Zend opcache opcache v7.0.0.0.0.66的Zend Technologies -dev,版权(c)1999-2015,Zend Technologies with Xdebug v2.3.2,版权(C)2002-2015,Derick Rethans

为了进行这个测试,我使用了这个 脚本

许可以下: CC-BY-SA归因
scroll top