В 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?
magento2
magento-2.0
Мариус
источник
источник
Ответы:
Причина в производительности. Инстанция через новое немного быстрее рефлексии. Большинство классов имеют менее 8 аргументов, поэтому этот переключатель охватывает большинство случаев.
Может быть, это будет удалено.
источник
Прирост производительности практически не виден. Когда я пытаюсь создать экземпляр 1000000 объектов с помощью 2 методов, вот результат:
Я использую бета-версию Magento 2 и версию PHP (см. Ниже)
Чтобы сделать этот тест, я использовал этот скрипт
источник