2015-06-27 12 views
6

tôi thấy câu lệnh switch lạ này trong Laravel 5 core:Không phải là tuyên bố chuyển đổi này là vô nghĩa?

switch (count($args)) { 
    case 0: 
     return $instance->$method(); 
    case 1: 
     return $instance->$method($args[0]); 
    case 2: 
     return $instance->$method($args[0], $args[1]); 
    case 3: 
     return $instance->$method($args[0], $args[1], $args[2]); 
    case 4: 
     return $instance->$method($args[0], $args[1], $args[2], $args[3]); 
    default: 
     return call_user_func_array([$instance, $method], $args); 

Có bất kỳ lý do tại sao họ có thể quyết định xây dựng một điều như vậy thay vì chỉ sử dụng này?

return call_user_func_array([$instance, $method], $args); 

Bất kỳ lợi ích nào?

+0

Có thể điều này đã được dịch từ một ngôn ngữ có chức năng quá tải. Hoặc, họ nhận thấy rằng có một sự tăng hiệu suất nhỏ trong các trường hợp phổ biến nhất (có lẽ là $ args là 4 hoặc ít hơn). –

+0

Không có điều này là vô nghĩa .. ngôn ngữ như c + + hỗ trợ này và được gọi là quá tải chức năng của nó, ** Đa hình ** có thể đạt được thông qua quá tải –

+2

@ NullPoiиteя Nhưng PHP không có quá tải chức năng. –

Trả lời

6

IMHO người lập trình tránh được call_user_func_array() cho số lượng cuộc gọi thông thường hợp lý tới $instance->method(). Tất nhiên nó là nhanh hơn để gọi phương thức trực tiếp thay vì sử dụng call_user_func_array(). Mã được viết bằng tình yêu :)

+1

Có lẽ Laravel sớm yêu cầu PHP 5.6+, sau đó họ sẽ có thể làm điều này ít lạ mắt: 'return $ instance-> method (... $ args);'. –

+3

@RoboRobok Tôi tưởng tượng ảnh hưởng trực tiếp của mã này là từ [nhận xét này] (http://php.net/manual/en/function.call-user-func-array.php#100794) về chức năng trong PHP tài liệu. Github cho thấy mã ban đầu được cam kết vào tháng 1 năm 2010, vì vậy tác giả đã có nhiều khả năng lo lắng về hiệu suất trong PHP 5.3. – patricus

+0

@patricus Tốt bắt! Tự hỏi tại sao tất cả các bình luận đều bị bỏ phiếu. – hek2mgl

0

Có thể có các hàm có tối đa 4 đối số dự kiến ​​sẽ vượt qua theo giá trị thay vì truyền theo tham chiếu. Chú ý lưu ý về tài liệu hàm về việc sử dụng PHP 5.4 trước. call_user_func_array docs

Các vấn đề liên quan