2010-04-14 9 views
10

Cuando uso call_user_func en un método no estático en PHP 5.2 recibo una advertencia estricta:¿Está bien llamar a métodos no estáticos con call_user_func en PHP 5.3?

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

Pero en PHP 5.3.1 No entiendo esta advertencia. ¿Es esto un error en PHP 5.3.1 o se eliminó la advertencia?

+0

Obtendrá la misma advertencia en PHP5.3. Parece que su configuración php5.3 y php5.2 son diferentes. Eche un vistazo a 'error_reporting'. – vooD

Respuesta

23

Es perfectamente bien - pero tenga en cuenta que usted tiene que pasar un objeto que es una instancia de su clase, para indicar en qué objeto el método no estático será llamada:

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

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


Usted no debe usar algo como esto:

call_user_func('MyClass::hello'); 

que le dará la siguiente advertencia:

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

(Esto funcionaría perfectamente bien si el método se declara como estática ... pero no lo es, aquí)


Para más información, se puede echar un vistazo a la sección callback del manual, que establece, entre otras cosas (donde se cita):

un método de un objeto instanciado se pasado como una matriz que contiene un objeto en el índice 0 y el nombre del método en el índice 1.


Si se obtiene un error estricta con PHP 5.2 y no con PHP 5.3, es probable que sea una cuestión de configuración - Estoy pensando en la directiva error_reporting.

Tenga en cuenta que no incluye E_ALLE_STRICT(quoting):

E_ALL: Todos los errores y advertencias, como soportados, excepto de nivel E_STRIC T.

+1

Se supone que E_STRICT se incluyó en E_ALL en PHP 5.3, creo. Por cierto gracias, instanciar el objeto y luego funciona bien. – sandelius

+0

OK sobre la instancia del objeto :-) ;;; No creo que E_STRICT esté incluido en E_ALL, incluso en PHP 5.3. Supongo que lo diría en el manual ;-) –

+0

'E_ALL' incluye' E_STRICT' en 5.5. –

Cuestiones relacionadas