2010-02-26 12 views

Trả lời

11

Có ít leat hai sự khác biệt giữa forward_static_call_arraycall_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ự.

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