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 Beta та 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, від Derick Rethans

Для того щоб зробити цей тест, я використав цей скрипт


Ну ... Антон сказав "трохи швидше". Що це :). Але все одно ... + 1 для профілювання.
Маріус

Цей код було додано давно. Він був протестований на PHP 5.3. На пізніших версіях різниця стала менш помітною, тому я у своїй відповіді зазначив, що цей код може бути видалений пізніше.
Антон Криль

@AntonKril Натомість ви накачали його до 15 параметрів ? ;-)
Фабіан Шменглер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.