2010-04-14 14 views
10

Quando uso call_user_func su un metodo non statico in PHP 5.2 Ho ricevuto un avviso Strict:Va bene chiamare metodi non statici con call_user_func in PHP 5.3?

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

Ma su PHP 5.3.1 non ottengo questo avvertimento. Si tratta di un bug in PHP 5.3.1 o l'avviso è stato rimosso?

+0

Otterrete lo stesso avviso su PHP5.3. Sembra che la configurazione di php5.3 e php5.2 sia diversa. Dai un'occhiata a error_reporting'. – vooD

risposta

23

è perfettamente OK - ma nota che devi passare un oggetto che è un'istanza della classe, di indicare su quale oggetto il metodo non statico sarà chiamata:

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

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


È non dovrebbe usare qualcosa di simile:

call_user_func('MyClass::hello'); 

che vi darà il seguente avviso:

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

(Questo avrebbe funzionato perfettamente bene se il metodo è stato dichiarato come static ... ma non è, qui)


Per maggiori informazioni, si può dare un'occhiata alla sezione di callback del manuale, che afferma, tra le altre cose (citando):

un metodo di un oggetto istanziato è passato come un vettore contenente un oggetto di indice 0 e il nome del metodo di indice 1.


Se si ottiene un errore severo con PHP 5.2 e non con PHP 5.3, è probabilmente una questione di configurazione - Sto pensando alla direttiva error_reporting.

noti che E_ALL non include E_STRICT(quoting):

E_ALL: Tutti gli errori e le avvertenze, come sostenuto, ad eccezione del livello E_STRIC T.

+1

E_STRICT dovrebbe essere incluso in E_ALL in PHP 5.3 Penso. Grazie, ho istanziato l'oggetto e poi funziona bene. – sandelius

+0

OK su instanciating l'oggetto :-) ;;; Non credo che E_STRICT sia incluso in E_ALL, anche in PHP 5.3 - Suppongo che sarebbe stato detto così nel manuale ;-) –

+0

'E_ALL' include' E_STRICT' in 5.5 sicuramente. –