2011-07-14 18 views
9

Parece (PHP 5.3) que si está anulando un método de clase, está bien que pueda agregar parámetros adicionales, siempre y cuando tengan valores predeterminados.adición de parámetros al método reemplazado Observación E_STRICT

Por ejemplo, considere la clase:

class test1 { 
    public function stuff() { 
    echo "Hi"; 
    } 
} 

La siguiente clase extiende "test1" y producirá una advertencia E_STRICT.

class test2 extends test1 { 
    public function stuff($name) { 
    echo "Hi $name"; 
    } 
} 

Pero, lo siguiente no produce una advertencia E_STRICT.

class test3 extends test1 { 
    public function stuff($name = "") { 
    echo "Hi $name"; 
    } 
} 

Mientras clase "test3" no produce una advertencia E_STRICT, he tenido la impresión de que PHP no permite firmas de los métodos que sean sobrecargados anulados. Entonces, tengo que preguntar. ¿Es mi observación un error/defecto o realmente correcto comportamiento previsto?

Además, si un parámetro predeterminado argumento está bien, ¿por qué es un parámetro argumento no predeterminado no está bien?

+0

tengo error_reporting (E_ALL) establecido y no puedo reproducir el erorr de E_STRICT. ¿Puedes publicar el error que estás viendo? Además, este no es un caso de 'sobrecarga', es 'sobreescritura'. – helloandre

+0

@helloandre, E_STRICT no incluido en E_ALL. Para activar las notificaciones de E_STRICT, establezca 'error_reporting (E_ALL | E_STRICT);' –

+1

@helloandre y E_STRICT no se genera en este caso :) –

Respuesta

-1

Esto no es un error y es una práctica de programación PHP aceptable.

Tenga en cuenta que las anulaciones múltiples pueden causar programmer headaches y deben evitarse siempre que sea posible.

Como alternativa, normalmente tengo una sola clase extendida para sobrescribir por clase o simplemente sobrecargar un método de clase dentro de la misma clase.

5

Si agrega un parámetro no predeterminado a un método reemplazado, la subclase ya no satisface el contrato definido por la superclase. No puede llamar correctamente a test2-> stuff(), porque este método ahora espera un parámetro, pero la superclase dice que debería poder llamarlo sin uno. De ahí la advertencia E_STRICT.

Sin embargo, si agrega un parámetro predeterminado, aún puede llamar a test3-> stuff() (de su ejemplo), como espera la superclase, para que el contrato no se rompa. De hecho, al agregar el parámetro opcional, simplemente lo ha extendido.

Cuestiones relacionadas