Tworzenie instancji Magento 2 przez fabrykę menedżerów obiektów

9

W Magento 2 klasy są instancja przy użyciu menedżera fabryki obiektu: \Magento\Framework\ObjectManager\Factory\Factory::create().
Do tej pory tak bardzo. Ale jest coś, czego tutaj nie rozumiem.
Po sprawdzeniu, czy w argumentach nie ma odwołań cyklicznych, które powinny być przekazane do konstruktora dla DI, a po ustaleniu argumentów jest to ( $argssą argumenty, które należy przekazać do konstruktora):

    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);
    }

Dlaczego to długie switchstwierdzenie? Dlaczego nie użyć bezpośrednio kodu z defaultoddziału?
Lub dlaczego zatrzymać casena 8? Dlaczego nie 5, 10 lub 127?

Marius
źródło
bardzo kodowanie łóżka
Keyul Shah
1
@KeyulShah. Być może, ale jestem prawie pewien, że kryje się za tym jakiś powód.
Marius

Odpowiedzi:

11

Powodem jest wydajność. Tworzenie instancji za pomocą nowego jest nieco szybsze niż odbicie. Większość klas ma mniej niż 8 argumentów, więc ten przełącznik obejmuje większość przypadków.

Może zostanie usunięty.

Anton Kril
źródło
1
Dziękuję za odpowiedź. Muszę powiedzieć, że jestem trochę rozczarowany. Spodziewałem się czegoś wymyślnego. :)
Marius
1
Wydajność nie jest wystarczającym powodem? :)
Anton Kril
3
Ponadto, w przypadku gdy nie jest to jasne z odpowiedzi, nieco szybsza implementacja w czymś, co często się zdarza (tj. Tworzenie instancji obiektu) jest tego warta.
Alan Storm
1
@AntonKril. Nie mówiłem o powodach. Miałem nadzieję na wymyślną odpowiedź w rodzaju „Ponieważ robimy to w ten sposób, twoje piwo nigdy się nie nagrzeje” lub coś w tym rodzaju. Ale myślę, że „wydajność” zrobi to na razie. Proszę, bądź blisko. inne pytania filozoficzne pojawią się w ciągu najbliższych dni. :)
Marius
6

Wzrost wydajności jest prawie niewidoczny. Gdy próbuję utworzyć instancję 1000000 obiektów za pomocą 2 metod, oto wynik:

wprowadź opis zdjęcia tutaj

Używam Magento 2 Beta i wersji PHP (patrz poniżej)

PHP 5.6.12-1 + deb.sury.org ~ zaufany + 1 (cli) Copyright (c) 1997-2015 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies z Zend OPcache v7.0.6 -dev, Copyright (c) 1999-2015, autor: Zend Technologies z Xdebug v2.3.2, Copyright (c) 2002-2015, autor: Derick Rethans

Aby wykonać ten test, użyłem tego skryptu

Michael R.
źródło
Cóż ... Anton powiedział, że jest „nieco szybszy”. Który to jest :). Ale w każdym razie ... + 1 za profilowanie.
Marius
Ten kod został dodany dawno temu. Został przetestowany na PHP 5.3. W późniejszych wersjach różnice stały się mniej widoczne, dlatego w mojej odpowiedzi wspomniałem, że ten kod może zostać później usunięty.
Anton Kril
@AntonKril Zamiast tego przepompowałeś do 15 parametrów ? ;-)
Fabian Schmengler