Cụ thể, có hiệu quả hơn cái kia không?Trong PHP, có lợi thế nào khi sử dụng forward_static_call_array() thay vì call_user_func_array() khi tự động gọi một phương thức tĩnh?
Trả lời
Có ít leat hai sự khác biệt giữa forward_static_call_array
và call_user_func_array
:
- Người đầu tiên chỉ tồn tại kể từ khi PHP 5.3
- Người đầu tiên phải được gọi từ bên trong một lớp
Sau đó , Tôi cho rằng có một số khác biệt liên quan đến Ràng buộc tĩnh muộn, được giới thiệu với PHP 5.3.
Trên thực tế, nếu bạn xem xét kỹ ví dụ đã cho, có vẻ như chính xác: "ngữ cảnh" của lớp bạn đang sử dụng forward_static_call_array
được "giữ", theo phương thức được gọi.
Xét phần mã này, điều đó có nguồn gốc từ các ví dụ đưa ra:
class A {
const NAME = 'A';
public static function test() {
$args = func_get_args();
echo static::NAME, " ".join(',', $args)." \n"; // Will echo B
}
}
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
forward_static_call_array(array('A', 'test'), array('more', 'args'));
}
}
B::test('foo');
Bạn sẽ nhận được kết quả này:
B
B more,args
tức là từ phương pháp trong lớp A, bạn "biết" , thông qua từ khóa static::
, rằng bạn "đến từ B".
Bây giờ, nếu bạn cố gắng làm những điều tương tự với call_user_func
:
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
call_user_func_array(array('A', 'test'), array('more', 'args'));
}
}
(phần còn lại của mã không thay đổi)
Bạn sẽ nhận được kết quả này :
B
A more,args
Lưu ý A trên dòng thứ hai! Với forward_static_call_array
, bạn không nhận được A, nhưng là B.
Đó là sự khác biệt: forward_static_call_array
chuyển tiếp ngữ cảnh tĩnh đến phương thức được gọi, trong khi call_user_func_array
thì không.
Giới thiệu về câu hỏi hiệu quả của bạn: Tôi không có ý tưởng - bạn phải chuẩn; nhưng đó không thực sự là vấn đề: vấn đề là hai chức năng đó không làm điều tương tự.
- 1. Gọi phương thức tĩnh động trong PHP?
- 2. Cách Groovy để tự động gọi một phương thức tĩnh
- 3. Có lợi thế nào khi sử dụng các khóa @array thay vì 0 .. $ # array không?
- 4. Sử dụng $ này trong phương pháp gọi với call_user_func_array
- 5. Có lợi ích thực sự nào khi sử dụng phương thức javascript Array reduce() không?
- 6. Sử dụng loại tĩnh thay vì biến
- 7. Khi nào sử dụng Float32Array thay vì Array trong JavaScript
- 8. Khi nào tôi nên sử dụng các phương pháp tĩnh trong một lớp học và các lợi ích là gì?
- 9. PHP Có thể tĩnh :: thay thế tự ::?
- 10. Làm thế nào để gọi phương thức tĩnh trong PowerShell
- 11. Làm thế nào tôi có thể gọi một phương thức tĩnh trên một lớp biến?
- 12. Điều gì sẽ xảy ra khi bạn gọi một phương thức tĩnh trong C#?
- 13. Khi nào gọi phương thức Dispose() trong ứng dụng WPF
- 14. Phương thức gọi trong EJB khi khởi động JBoss
- 15. Có lợi thế nào khi sử dụng một lớp Python không?
- 16. Có lợi thế nào khi sử dụng AND và OR trên && và || trong PHP?
- 17. Làm cách nào để tự động gọi một phương thức trên một đối tượng động?
- 18. Khi nào nên sử dụng các phương thức trình bao bọc jQuery thay vì các phương thức javascript tích hợp
- 19. Khi nào bạn nên sử dụng mẫu đơn thay vì một lớp tĩnh?
- 20. khi nào nên sử dụng index.php thay vì index.html
- 21. Làm thế nào để gọi một phương thức không tĩnh từ một phương thức tĩnh trong C#?
- 22. Phương thức cơ sở cuộc gọi thay vì ghi đè
- 23. javascript gọi phương thức nội bộ khi sử dụng jquery
- 24. Python phương pháp tĩnh - làm thế nào để gọi một phương thức từ phương pháp khác
- 25. Có lợi ích gì khi sử dụng HtmlHelper trong MVC?
- 26. ajax php javascript: lỗi khi sử dụng phương thức POST
- 27. jQuery - cách sử dụng phương thức "on()" thay vì "live()"?
- 28. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 29. Tôi có thể sử dụng phương thức tĩnh làm gọi lại menu trong drupal không?
- 30. Sử dụng bộ nhớ khi chuyển đổi phương thức sang phương thức tĩnh