Magento 2 lớp khởi tạo thông qua nhà máy quản lý đối tượng


9

Trong magento 2, các lớp được khởi tạo bằng cách sử dụng một nhà máy quản lý đối tượng : \Magento\Framework\ObjectManager\Factory\Factory::create().
Cho đến nay rất nhiều. Nhưng có một cái gì đó mà tôi không hiểu ở đây.
Sau khi kiểm tra xem không có tham chiếu vòng tròn nào trong các đối số nên được truyền cho hàm tạo cho DI và sau khi các đối số được xác định, đây là ( $argscác đối số sẽ được truyền cho hàm tạo):

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

Tại sao switchtuyên bố dài này ? Tại sao không sử dụng trực tiếp mã từ defaultchi nhánh?
Hoặc tại sao dừng lại caseở 8? Tại sao không phải là 5 hay 10 hay 127?


mã hóa rất giường
Keyul Shah

1
@KeyulShah. Có thể, nhưng tôi gần như chắc chắn có một lý do đằng sau điều này.
Marius

Câu trả lời:


11

Lý do là hiệu suất. Khởi tạo thông qua mới là hơi nhanh hơn so với phản ánh. Hầu hết các lớp có ít hơn 8 đối số nên chuyển đổi này bao gồm hầu hết các trường hợp.

Có lẽ nó sẽ bị xóa.


1
Cảm ơn câu trả lời. Tôi phải nói rằng tôi hơi thất vọng. Tôi đã mong đợi một cái gì đó lạ mắt. :)
Marius

1
Hiệu suất không đủ tốt lý do? :)
Anton Kril

3
Ngoài ra, trong trường hợp không rõ câu trả lời, việc triển khai nhanh hơn một chút trong một điều gì đó xảy ra rất nhiều (tức là bắt đầu một đối tượng) cũng rất đáng giá.
Alan Storm

1
@AntonKril. Tôi đã không nói về lý do. Tôi đã hy vọng cho một câu trả lời lạ mắt như "Bởi vì chúng tôi làm theo cách này, bia của bạn sẽ không bao giờ ấm lên" hoặc đại loại như thế. Nhưng tôi đoán "hiệu suất" sẽ làm điều đó ngay bây giờ. Hãy ở gần đây. các câu hỏi triết học khác sẽ theo sau trong những ngày tiếp theo. :)
Marius

6

Hiệu suất đạt được gần như vô hình. Khi tôi cố gắng khởi tạo 1000000 đối tượng bằng 2 phương thức, đây là kết quả:

nhập mô tả hình ảnh ở đây

Tôi đang sử dụng phiên bản Magento 2 Beta và PHP (xem bên dưới)

PHP 5.6.12-1 + deb.sury.org ~ tin cậy + 1 (cli) Bản quyền (c) 1997-2015 Nhóm Zend Engine v2.6.0, Bản quyền (c) 1998-2015 Zend Technologies với Zend OPcache v7.0.6 -dev, Bản quyền (c) 1999-2015, bởi Zend Technologies với Xdebug v2.3.2, Bản quyền (c) 2002-2015, bởi Derick Rethans

Để thực hiện bài kiểm tra này, tôi đã sử dụng tập lệnh này


Chà ... Anton nói là "nhanh hơn một chút". Mà đó là :). Nhưng dù sao ... + 1 cho hồ sơ.
Marius

Mã này đã được thêm vào từ lâu. Nó đã được thử nghiệm trên PHP 5.3 Trên các phiên bản sau, sự khác biệt trở nên ít thấy hơn, đó là lý do tại sao tôi đã đề cập trong câu trả lời của mình rằng mã này có thể bị xóa sau đó.
Anton Kril

@AntonKril Thay vào đó, bạn đã bơm nó lên tới 15 thông số ? ;-)
Fabian Schmengler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.