Dalam Magento 2 kelas adalah yang dipakai menggunakan pabrik manajer objek: \Magento\Framework\ObjectManager\Factory\Factory::create()
.
Sejauh ini sangat buruk. Tetapi ada sesuatu yang tidak saya mengerti di sini.
Setelah memeriksa apakah tidak ada referensi melingkar dalam argumen yang harus diteruskan ke konstruktor untuk DI dan setelah argumen ditentukan ada ini ( $args
adalah argumen yang harus diteruskan ke konstruktor):
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);
}
Mengapa switch
pernyataan panjang ini ? Mengapa tidak menggunakan langsung kode dari default
cabang?
Atau mengapa menghentikan case
jam 8? Kenapa tidak 5 atau 10 atau 127?
magento2
magento-2.0
Marius
sumber
sumber
Jawaban:
Alasannya adalah kinerja. Instansiasi melalui yang baru sedikit lebih cepat daripada refleksi. Sebagian besar kelas memiliki kurang dari 8 argumen sehingga switch ini mencakup sebagian besar kasus.
Mungkin itu akan dihapus.
sumber
Keuntungan kinerja hampir tidak terlihat. Ketika saya mencoba untuk instantiate 1000000 objek dengan 2 metode, berikut adalah hasilnya:
Saya menggunakan versi Magento 2 Beta dan PHP (lihat di bawah)
Untuk melakukan tes ini, saya menggunakan skrip ini
sumber