Magento 2通过对象管理器工厂实例化类
-
12-12-2019 - |
题
在 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 个对象时,结果如下:
我正在使用 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
为了进行这个测试,我使用了这个 脚本