Magento 2通过对象管理器工厂实例化类


9

在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?


非常床编码
Keyul Shah 2014年

1
@KeyulShah。可以,但是我几乎可以肯定这背后有一个原因。
马吕斯

Answers:


11

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

也许它将被删除。


1
感谢您的回答。我必须说我有点失望。我期待一些幻想。:)
Marius

1
性能不够好是什么原因?:)
Anton Kril 2014年

3
另外,如果答案还不清楚,那么在发生很多事情(即实例化一个对象)时稍微快一点的实现是值得的。
艾伦·斯托姆

1
@AntonKril。我不是在说原因。我希望得到一个像这样的答案:“因为我们这样做,所以您的啤酒永远不会变热”。但是我想“性能”现在就可以做到。请靠近。其他哲学问题将在接下来的几天出现。:)
Marius

6

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

在此处输入图片说明

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

PHP 5.6.12-1 + deb.sury.org〜trusty + 1(cli)版权所有(c)1997-2015 The PHP Group Zend Engine v2.6.0,版权所有(c)1998-2015 Zend Technologies with Zend OPcache v7.0.6 -dev,Zend Technologies的Xdebug v2.3.2版权所有(c)1999-2015,Derick Rethans,版权所有(c)2002-2015

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


好吧...安东说“稍微快一点”。这是:)。但是无论如何... +1为分析。
马里斯(Marius)

此代码是很久以前添加的。它已经在PHP 5.3上进行了测试。在更高版本上,差异变得不那么明显了,这就是为什么我在回答中提到可以稍后删除此代码的原因。
Anton Kril

@AntonKril而是将其最多抽取15个参数?;-)
Fabian Schmengler
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.