Herencia básica
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 21 de 91.
La herencia permite que una clase adquiera propiedades y métodos de otra clase. En lugar de volver a escribir el mismo código, puedes crear una clase base con funcionalidad compartida y hacer que otras clases hereden de ella.
La clase de la que se hereda se llama clase padre (o clase base), y la clase que hereda se llama clase hija. Se utiliza la palabra clave extends para establecer esta relación:
<?php
class Animal {
public $name;
public function __construct($name) {
this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();
Salida:
Buddy makes a sound
Buddy fetches the ballLa clase Dog tiene acceso automáticamente a la propiedad $name, al constructor y al método speak() de Animal. También define su propio método fetch() que solo los perros tienen.
Esto crea una jerarquía clara: cada perro es un animal, por lo que tiene sentido que Dog herede de Animal. La clase hija puede usar todo lo de la clase padre mientras añade su propio comportamiento especializado.
Punto clave: La herencia promueve la reutilización de código y establece relaciones lógicas entre las clases. La clase hija hereda todos los miembros públicos y protegidos del padre, reduciendo la duplicación y haciendo que su código sea más fácil de mantener.
Desafío
FácilVamos a construir un sistema de jerarquía de vehículos que demuestre cómo la herencia permite que las clases hijas compartan la funcionalidad de una clase padre mientras añaden sus propios comportamientos especializados.
Organizarás tu código en tres archivos:
Vehicle.php— Define una claseVehicleque sirva como padre para todos los vehículos. Debe tener una propiedad pública$brandy un constructor que acepte y establezca la marca. Incluye un métodostart()que devuelva"[brand] is starting"y un métodostop()que devuelva"[brand] is stopping".Motorcycle.php— Define una claseMotorcycleque extienda deVehicle. Incluye el archivo Vehicle al principio. La clase Motorcycle no necesita su propio constructor ya que heredará el constructor del padre. Añade un métodowheelie()que devuelva"[brand] is doing a wheelie!"— este es un comportamiento único de las motocicletas.main.php— Incluye el archivo Motorcycle (que ya incluye a Vehicle). Recibirás una entrada: la marca de la motocicleta. Crea un objetoMotorcyclecon esta marca. Imprime el resultado de llamar astart(), luego awheelie(), y después astop(), cada uno en su propia línea.
Observa cómo la clase Motorcycle hereda automáticamente la propiedad $brand, el constructor y los métodos start() y stop() de Vehicle. La clase hija solo necesita definir lo que la hace única; en este caso, la capacidad de hacer un caballito (wheelie). Este es el poder de la herencia: escribir la funcionalidad común una vez en el padre y permitir que los hijos la reutilicen mientras añaden sus propias especializaciones.
Hoja de referencia
La herencia permite que una clase adquiera propiedades y métodos de otra clase utilizando la palabra clave extends. La clase de la que se hereda se llama clase padre (o clase base), y la clase que hereda se llama clase hija.
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak(); // Buddy hace un sonido
echo $dog->fetch(); // Buddy trae la pelota
La clase hija hereda todos los miembros públicos y protegidos del padre, incluyendo propiedades, constructores y métodos. La hija también puede añadir sus propios métodos y propiedades especializados.
La herencia promueve la reutilización de código y establece relaciones lógicas entre clases, reduciendo la duplicación y facilitando el mantenimiento del código.
Pruébalo tú mismo
<?php
// Incluye la clase Motorcycle (que ya incluye Vehicle)
require_once 'Motorcycle.php';
// Leer la entrada
$brand = trim(fgets(STDIN));
// TODO: Crear un objeto Motorcycle con la marca
// TODO: Imprimir el resultado de start()
// TODO: Imprimir el resultado de wheelie()
// TODO: Imprimir el resultado de stop()
?>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 OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy