Básicamente debemos resolver un dilema conceptual al redefinir un método de una clase nieta.
Supongamos ...
Código PHP:
// clase Abuelo
class A {
public function miMetodo () {
}
}
class B extends A {
public function miMetodo () {
/*
Código que define el comportamiento del método antes de invocar al método padre.
*/
// Llamamos metodo padre (A)
parent::miMetodo();
}
}
class C extends B {
public function miMetodo () {
/*
Código que define el comportamiento del método antes de invocar al método padre.
*/
// Llamamos metodo padre (B)
parent::miMetodo();
}
}
Analizando la naturaleza de nuestra aplicación cada uno ha propuesto una solción para resolver nuestro problema.
La primera es justamente invocar al metodo abuelo (clase A) miMetodo() desde la clase C salteando la definición del método padre (clase B) ya que, a causa de otras modificaciones necesarias en otros métodos de la clase, este código afecta en un 100% al buen funcionamiento de la aplicación. O sea, no funca.
Código PHP:
class C extends B {
public function miMetodo ($condicion = true) {
/*
Código que define el comportamiento del método antes de invocar al método padre.
*/
// Llamamos metodo abuelo (A)
A::miMetodo();
}
}
Código PHP:
class C extends B {
public function miMetodo ($condicion = true) {
/*
Código que define el comportamiento del método antes de invocar al método padre.
*/
// Agregamos comportamiento condicional en función del nuevo parámetro $condicion agregado por primera vez en esta clase C
if ($condicion) ...
else ...
// Llamamos metodo padre (C)
parent::miMetodo();
}
}
Y por otro lado la inclusión de un parámetro en la re definición del método y no saltear el método padre.
Hay varias cosas más que nos obligan a definir este comportamiento; por ejemplo, y algo muy importante, no podemos tocar ni la clase A ni la B. Si prestamos atención, en ninguno de los dos casos hacemos esto.
En fin ... saludos. Pregunen todo lo que quieran.