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 necesitas acceder directamente a los métodos o propiedades de la clase padre. La palabra clave parent:: te permite llamar a la implementación de la clase padre desde dentro de la clase hija.
Esto es especialmente útil en los constructores cuando la clase hija necesita inicializar las propiedades de la clase padre y, al mismo tiempo, configurar 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 de la clase principal en lugar de duplicarla. Sin esta llamada, la propiedad $name nunca se establecería.
Puedes usar parent:: para llamar a cualquier método principal, no solo a constructores. Esto se vuelve especialmente importante cuando quieres ampliar 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 principal. Es esencial para encadenar correctamente los constructores y para desarrollar la funcionalidad heredada en lugar de reescribirla.
Desafío
FácilConstruyamos un sistema de catálogo de productos que demuestre cómo las clases secundarias pueden ampliar la funcionalidad de las clases principales usando la palabra clave parent:: para encadenar correctamente los constructores y aprovechar 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, y establece ambas propiedades. Incluye un métodogetDetails()que devuelva"[name]: $[price]".ElectronicProduct.php: Define una claseElectronicProductque extiendaProduct. 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: usaparent::__construct()para inicializar el nombre y el precio a través de la clase principal y, después, establece tú mismo la garantía. Crea un métodogetDetails()que se base en la implementación de la clase principal: 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 que se convertirá en un número de punto flotante) y el período de garantía (como una cadena que se convertirá en un entero). Crea unElectronicProductcon estos valores e imprime el resultado de llamar agetDetails().
Este desafío muestra el verdadero poder de parent::. No solo sirve para encadenar constructores, sino también para ampliar el comportamiento de los métodos. Tu ElectronicProduct reutiliza la lógica de formato de la clase principal y añade sus propios detalles, evitando la duplicación de código y creando una salida más completa.
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: Crea un ElectronicProduct con los valores de entrada
// e imprime 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 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