tutorial - PHP: "La declaración de... debería ser compatible con la de..."
symfony php descargar (2)
Anulación de constructores es un caso especial :
A diferencia de otros métodos, PHP no generará un mensaje de error de nivel
E_STRICT
cuando__construct()
se__construct()
con parámetros diferentes a los que tiene el método padre__construct()
.
No puedes hacer eso con otros métodos.
Me gustaría crear una interfaz para entidades que son CRUDables (se pueden guardar y eliminar). Aquí está mi clase abstracta:
abstract class AbstractCrudableEntity extends AbstractEntity
{
abstract public function doSave();
abstract public function doDelete();
}
Mi clase de implementación necesita un par de parámetros adicionales para esos métodos. Aquí está la firma de la clase de implementación:
class Contact extends AbstractCrudableEntity {
public function doSave(User $user, /UberClientManager $manager);
public function doDelete(User $user, /UberClientManager $manager);
}
Entiendo que PHP requiere que las clases implementadas tengan los mismos parámetros para los métodos que la clase padre (hay varias preguntas que responden a esta pregunta: esto , por ejemplo). Así que, ese no es el problema.
Sin embargo, recientemente me encontré con un código en Symfony que trata con tokens de autenticación. La clase UsernamePasswordToken
extiende AbstractToken
, y tiene un conjunto diferente de parámetros en el método __construct()
: AbstractToken::__construct()
versus UsernamePasswordToken::__construct()
.
Mi pregunta es ¿cómo puede Symfony hacer esto? ¿Cuál es la diferencia entre esto y mi código?
Los métodos secundarios deben tener la misma cantidad de parámetros que los métodos abstractos en una clase principal abstracta.
El constructor en tu ejemplo no es abstracto: el hijo simplemente lo está anulando.