Sobrescritura de métodos
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 23 de 91.
A veces, el método heredado de una clase padre no se ajusta del todo a lo que necesita la clase hija. La sobrescritura de métodos permite que una clase hija proporcione su propia implementación de un método que ya existe en la clase padre.
Para sobrescribir un método, simplemente define un método en la clase hija con el mismo nombre que el método de la clase padre:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "$this->name says meow";
}
}
$cat = new Cat("Whiskers");
echo $cat->speak();
Salida:
Whiskers says meowLa clase Cat reemplaza por completo el método speak() del padre con su propia versión. Cuando llamas a speak() en un objeto gato, PHP utiliza la implementación de la clase hija.
También puedes ampliar el comportamiento del padre combinando parent:: con tu propia lógica:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
Salida:
Rex makes a sound - woof woof!Punto clave: La sobrescritura de métodos permite que las clases hijas personalicen el comportamiento heredado. Puedes reemplazar por completo un método o usar parent:: para ampliar la implementación original.
Desafío
FácilConstruyamos un sistema de notificaciones que demuestre cómo las clases hijas pueden reemplazar o extender por completo los métodos de las clases padre mediante la sobrescritura de métodos.
Crearás tres archivos que funcionan juntos para enviar distintos tipos de notificaciones, cada uno con su propio comportamiento único:
Notification.php: Define una claseNotificationque sirve como base para todos los tipos de notificación. Debe tener una propiedad pública$recipienty un constructor que acepte y establezca el destinatario. Incluye un métodosend($message)que devuelva"Sending to [recipient]: [message]".UrgentNotification.php: Define una claseUrgentNotificationque extiendaNotification. Incluye el archivo Notification al principio. Esta clase debe sobrescribir por completo el métodosend($message)para devolver"URGENT to [recipient]: [message]!!!": observa el prefijo "URGENT" y los signos de exclamación del final. Esto demuestra el reemplazo completo del comportamiento de la clase padre.LoggedNotification.php: Define una claseLoggedNotificationque extiendaNotification. Incluye el archivo Notification al principio. Esta clase debe sobrescribirsend($message), pero basarse en la implementación de la clase padre: llama aparent::send($message)y añade" [logged]"al resultado. Esto demuestra cómo extender el comportamiento en lugar de reemplazarlo.
En main.php, incluye los tres archivos de clases de notificación. Recibirás dos entradas: el nombre del destinatario y el mensaje que se enviará. Crea una instancia de cada tipo de notificación (todas usando el mismo destinatario) y, después, llama a send() con el mensaje en cada una. Imprime cada resultado en su propia línea, en este orden: notificación normal, notificación urgente y, después, notificación registrada.
Este desafío muestra ambos enfoques para sobrescribir métodos: UrgentNotification reemplaza por completo la lógica de la clase padre con su propio formato, mientras que LoggedNotification usa parent:: para conservar el comportamiento original y ampliarlo.
Pruébalo tú mismo
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// Leer entrada
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Crea una instancia de cada tipo de notificación (todas usando el mismo destinatario)
// TODO: Llama a send() con el mensaje en cada notificación
// Imprime cada resultado en su propia línea en este orden:
// 1. Notificación regular
// 2. Notificación urgente
// 3. Notificación registrada
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online