Magento 2 создание экземпляров классов через object manager factory
-
12-12-2019 - |
Вопрос
В magento 2 классы создаются с использованием фабрики object manager: \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 аргументов, поэтому этот переключатель охватывает большинство случаев.
Может быть, это будет удалено.
Другие советы
Прирост производительности практически незаметен.Когда я пытаюсь создать экземпляр 1000000 объектов с помощью двух методов, вот результат :
Я использую бета-версию Magento 2 и PHP-версию (см. Ниже)
PHP 5.6.12-1+deb.sury.org ~ надежный + 1 (cli) Авторское право (c) 1997-2015 гг. PHP Group Zend Engine v2.6.0, Авторское право (c) 1998-2015 Zend Технологии с Zend OPcache версии 7.0.6-dev, Авторское право (c) 1999-2015, Zend Technologies с Xdebug v2.3.2, Авторское право (c) 2002-2015, автор Дерик Ретанс
Для того чтобы сделать этот тест, я использовал это сценарий