2010-04-14 59 views
10

Khi tôi sử dụng call_user_func trên một phương pháp không tĩnh trong PHP 5.2 tôi nhận được một cảnh báo nghiêm ngặt:Có thể gọi các phương thức không tĩnh với call_user_func trong PHP 5.3 không?

Strict Standards: Non-static method User::register() cannot be called statically 

Nhưng trên PHP 5.3.1 Tôi không nhận được cảnh báo này. Đây có phải là lỗi trong PHP 5.3.1 hay là cảnh báo đã bị xóa?

+0

Bạn sẽ nhận được cảnh báo tương tự trên PHP5.3. Có vẻ như cấu hình php5.3 và php5.2 của bạn khác nhau. Có một cái nhìn tại 'error_reporting'. – vooD

Trả lời

23

Nó là hoàn toàn OK - nhưng lưu ý rằng bạn phải vượt qua một đối tượng mà là một thể hiện của lớp học của bạn, để cho biết mà phản đối phương pháp không tĩnh được gọi là:

class MyClass { 
    public function hello() { 
     echo "Hello, World!"; 
    } 
} 

$a = new MyClass(); 
call_user_func(array($a, 'hello')); 


Bạn không nên sử dụng một cái gì đó như thế này:

call_user_func('MyClass::hello'); 

Mà sẽ cung cấp cho bạn những cảnh báo sau đây:

Strict standards: `call_user_func()` expects parameter 1 to be a valid callback, 
non-static method `MyClass::hello()` should not be called statically 

(Điều này sẽ làm việc hoàn toàn tốt đẹp nếu phương pháp này đã được khai báo là tĩnh ... nhưng nó không phải là, ở đây)


Để biết thêm thông tin, bạn có thể có một cái nhìn tại phần callback của cuốn cẩm nang, trong đó nêu, giữa những thứ khác (trích dẫn):

một phương pháp của một đối tượng cụ thể được thông qua như là một mảng chứa một đối tượng ở chỉ số 0 và tên phương pháp tại index 1.


Nếu bạn nhận được một lỗi nghiêm ngặt với PHP 5.2 và không phải với PHP 5.3, nó có thể là một vấn đề cấu hình - Tôi đang suy nghĩ về các chỉ thị error_reporting.

Lưu ý rằng E_ALL không bao gồm E_STRICT(quoting):

E_ALL: Tất cả lỗi và cảnh báo, như hỗ trợ, ngoại trừ mức E_STRIC T.

+1

E_STRICT là nghĩa vụ phải được bao gồm trong E_ALL trong PHP 5.3 Tôi nghĩ. Btw cảm ơn bạn, tôi instantiated đối tượng và sau đó nó hoạt động tốt. – sandelius

+0

OK về việc instanciating đối tượng :-) ;;; Tôi không nghĩ rằng E_STRICT được bao gồm trong E_ALL, ngay cả trong PHP 5.3 - Tôi cho rằng nó sẽ được nói như vậy trong hướng dẫn ;-) –

+0

'E_ALL' không bao gồm' E_STRICT' trong 5.5 cho chắc chắn. –

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