La palabra clave parent::
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 22 de 91.
Cuando una clase hija hereda de una clase padre, a veces es necesario acceder directamente a los métodos o propiedades del padre. La palabra clave parent:: le permite llamar a la implementación de la clase padre desde la clase hija.
Esto es especialmente útil en los constructores cuando el hijo necesita inicializar las propiedades del padre mientras también configura las suyas propias:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
Salida:
Max is a LabradorAl llamar a parent::__construct($name), la clase hija reutiliza la lógica de inicialización del padre en lugar de duplicarla. Sin esta llamada, la propiedad $name nunca se establecería.
Puedes usar parent:: para llamar a cualquier método padre, no solo a los constructores. Esto se vuelve particularmente importante cuando quieres extender el comportamiento de un método en lugar de reemplazarlo por completo.
Punto clave: La palabra clave parent:: proporciona una forma de acceder a la implementación de la clase padre. Es esencial para el encadenamiento adecuado de constructores y para construir sobre la funcionalidad heredada en lugar de reescribirla.
Desafío
FácilVamos a construir un sistema de catálogo de productos que demuestre cómo las clases hijas pueden extender la funcionalidad de los padres utilizando la palabra clave parent:: para encadenar constructores correctamente y construir sobre los métodos heredados.
Organizarás tu código en tres archivos:
Product.php— Define una claseProductque sirva como base para todos los productos. Debe tener las propiedades públicas$namey$price. El constructor acepta un nombre y un precio, estableciendo ambas propiedades. Incluye un métodogetDetails()que devuelva"[name]: $[price]".ElectronicProduct.php— Define una claseElectronicProductque extienda deProduct. Incluye el archivo Product al principio. Esta clase añade una propiedad$warranty(en meses). El constructor debe aceptar el nombre, el precio y la garantía — utilizaparent::__construct()para inicializar el nombre y el precio a través del padre, y luego establece la garantía tú mismo. Crea un métodogetDetails()que se base en la implementación del padre: llama aparent::getDetails()y añade" (Warranty: [warranty] months)"al final.main.php— Incluye el archivo ElectronicProduct. Recibirás tres entradas: el nombre del producto, el precio (como una cadena para convertir a float) y el periodo de garantía (como una cadena para convertir a entero). Crea unElectronicProductcon estos valores e imprime el resultado de llamar agetDetails().
Este desafío muestra el verdadero poder de parent:: — no solo para el encadenamiento de constructores, sino también para extender el comportamiento de los métodos. Tu ElectronicProduct reutiliza la lógica de formato del padre y añade sus propios detalles encima, evitando la duplicación de código mientras crea una salida más rica.
Hoja de referencia
La palabra clave parent:: permite que una clase hija acceda a métodos y propiedades de su clase padre.
Usa parent::__construct() para llamar al constructor del padre desde la clase hija:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
}
También puedes usar parent:: para llamar a cualquier método del padre y extender su comportamiento:
<?php
class Animal {
public function describe() {
return "This is an animal";
}
}
class Dog extends Animal {
public function describe() {
return parent::describe() . " and it's a dog";
}
}
Este enfoque permite que las clases hijas reutilicen la lógica del padre en lugar de duplicar código, permitiendo un encadenamiento de constructores y una extensión de métodos adecuados.
Pruébalo tú mismo
<?php
require_once 'ElectronicProduct.php';
// Leer entradas
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Crear un ElectronicProduct con los valores de entrada
// y mostrar el resultado de llamar a getDetails()
?>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