Создание экземпляров классов в 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?

Мариус
источник
очень кодирование кровати
Кейул Шах
1
@KeyulShah. Может быть, но я почти уверен, что есть причина этого.
Мариус

Ответы:

11

Причина в производительности. Инстанция через новое немного быстрее рефлексии. Большинство классов имеют менее 8 аргументов, поэтому этот переключатель охватывает большинство случаев.

Может быть, это будет удалено.

Антон Криль
источник
1
Спасибо за ответ. Я должен сказать, что я немного разочарован. Я ожидал чего-то необычного. :)
Мариус
1
Производительность не достаточно веская причина? :)
Антон Крыль
3
Кроме того, в случае, если из ответа не ясно, что немного более быстрая реализация чего-то, что происходит часто (например, создание объекта), того стоит.
Алан Шторм
1
@AntonKril. Я не говорил о причинах. Я надеялся на причудливый ответ типа «Потому что мы делаем это таким образом, ваше пиво никогда не нагреется» или что-то в этом роде. Но я думаю, что «производительность» сделает это сейчас. Держись поближе, пожалуйста. другие философские вопросы последуют в ближайшие дни. :)
Мариус
6

Прирост производительности практически не виден. Когда я пытаюсь создать экземпляр 1000000 объектов с помощью 2 методов, вот результат:

введите описание изображения здесь

Я использую бета-версию Magento 2 и версию PHP (см. Ниже)

PHP 5.6.12-1 + deb.sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies с Zend OPcache v7.0.6 -dev, Copyright (c) 1999-2015, Zend Technologies с Xdebug v2.3.2, Copyright (c) 2002-2015, Дерик Ретанс

Чтобы сделать этот тест, я использовал этот скрипт

Майкл Р
источник
Ну ... Антон сказал "немного быстрее". Который это :). Но в любом случае ... +1 для профилирования.
Мариус
Этот код был добавлен давно. Он был протестирован на PHP 5.3. В более поздних версиях разница стала менее заметной, поэтому я упомянул в своем ответе, что этот код может быть удален позже.
Антон Крыл
@AntonKril Вместо этого вы накачали его до 15 параметров ? ;-)
Фабиан Шменглер