Magento 2 classi di istanza tramite la factory di gestione oggetti


9

Magento 2 classi sono istanziati utilizzando un direttore di fabbrica oggetto: \Magento\Framework\ObjectManager\Factory\Factory::create().
Finora tutto appiccicoso. Ma c'è qualcosa che non capisco qui.
Dopo aver verificato se non ci sono riferimenti circolari negli argomenti che dovrebbero essere passati al costruttore per DI e dopo che gli argomenti sono stati determinati, c'è questo ( $argssono gli argomenti che dovrebbero essere passati al costruttore):

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

Perché questa lunga switchaffermazione? Perché non utilizzare direttamente il codice dalla defaultfiliale?
O perché fermare l' case8? Perché non 5 o 10 o 127?


codifica molto letto
Keyul Shah

1
@KeyulShah. Potrebbe essere, ma sono quasi sicuro che ci sia una ragione dietro questo.
Marius

Risposte:


11

Il motivo è la prestazione. L'istanza attraverso il nuovo è leggermente più veloce della riflessione. La maggior parte delle classi ha meno di 8 argomenti, quindi questa opzione copre la maggior parte dei casi.

Forse verrà rimosso.


1
Grazie per la risposta. Devo dire che sono un po 'deluso. Mi aspettavo qualcosa di speciale. :)
Marius

1
Le prestazioni non sono abbastanza buone ragioni? :)
Anton Kril,

3
Inoltre, nel caso in cui la risposta non risulti chiara, ne vale la pena un'implementazione leggermente più rapida in qualcosa che accade molto (ovvero istanziare un oggetto).
Alan Storm,

1
@AntonKril. Non stavo parlando dei motivi. Speravo in una risposta stravagante come "Perché facciamo così, la tua birra non si scalda mai" o qualcosa del genere. Ma immagino che "performance" lo farà per ora. Stai vicino per favore. altre domande filosofiche seguiranno nei prossimi giorni. :)
Marius

6

Il guadagno in termini di prestazioni è quasi invisibile. Quando provo a creare un'istanza di 1000000 oggetti con i 2 metodi, ecco il risultato:

inserisci qui la descrizione dell'immagine

Sto usando Magento 2 versione Beta e PHP (vedi sotto)

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

Per fare questo test, ho usato questo script


Bene ... Anton ha detto che è "leggermente più veloce". Quale è :). Ma comunque ... + 1 per la profilazione.
Marius

Questo codice è stato aggiunto molto tempo fa. È stato testato su PHP 5.3 Nelle versioni successive la differenza è diventata meno visibile ed è per questo che ho menzionato nella mia risposta che questo codice potrebbe essere rimosso in seguito.
Anton Kril,

@AntonKril Invece, hai pompato fino a 15 parametri ? ;-)
Fabian Schmengler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.