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 ( $args
są 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 switch
stwierdzenie? Dlaczego nie użyć bezpośrednio kodu z default
oddziału?
Lub dlaczego zatrzymać case
na 8? Dlaczego nie 5, 10 lub 127?
magento2
magento-2.0
Marius
źródło
źródło
Odpowiedzi:
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.
źródło
Wzrost wydajności jest prawie niewidoczny. Gdy próbuję utworzyć instancję 1000000 obiektów za pomocą 2 metod, oto wynik:
Używam Magento 2 Beta i wersji PHP (patrz poniżej)
Aby wykonać ten test, użyłem tego skryptu
źródło