A Palavra-chave parent::
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 22 de 91.
Quando uma classe filha herda de uma classe pai, às vezes você precisa acessar os métodos ou propriedades da classe pai diretamente. A palavra-chave parent:: permite que você chame a implementação da classe pai de dentro da classe filha.
Isso é especialmente útil em construtores quando o filho precisa inicializar as propriedades do pai enquanto também configura as suas próprias:
<?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();
Saída:
Max is a LabradorAo chamar parent::__construct($name), a classe filha reutiliza a lógica de inicialização da classe pai em vez de duplicá-la. Sem essa chamada, a propriedade $name nunca seria definida.
Você pode usar parent:: para chamar qualquer método pai, não apenas construtores. Isso se torna particularmente importante quando você deseja estender o comportamento de um método em vez de substituí-lo completamente.
Ponto Chave: A palavra-chave parent:: fornece uma maneira de acessar a implementação da classe pai. É essencial para o encadeamento adequado de construtores e para construir sobre a funcionalidade herdada em vez de reescrevê-la.
Desafio
FácilVamos construir um sistema de catálogo de produtos que demonstra como as classes filhas podem estender a funcionalidade dos pais usando a palavra-chave parent:: para encadear construtores corretamente e aprimorar métodos herdados.
Você organizará seu código em três arquivos:
Product.php— Defina uma classeProductque sirva como base para todos os produtos. Ela deve ter as propriedades públicas$namee$price. O construtor aceita um nome e um preço, definindo ambas as propriedades. Inclua um métodogetDetails()que retorna"[name]: $[price]".ElectronicProduct.php— Defina uma classeElectronicProductque estendeProduct. Inclua o arquivo Product no topo. Esta classe adiciona uma propriedade$warranty(em meses). O construtor deve aceitar nome, preço e garantia — useparent::__construct()para inicializar o nome e o preço através do pai e, em seguida, defina a garantia você mesmo. Crie um métodogetDetails()que se baseia na implementação do pai: chameparent::getDetails()e anexe" (Warranty: [warranty] months)"a ele.main.php— Inclua o arquivo ElectronicProduct. Você receberá três entradas: o nome do produto, o preço (como uma string para converter em float) e o período de garantia (como uma string para converter em um inteiro). Crie umElectronicProductcom esses valores e imprima o resultado da chamada degetDetails().
Este desafio mostra o real poder do parent:: — não apenas para o encadeamento de construtores, mas também para estender o comportamento dos métodos. Seu ElectronicProduct reutiliza a lógica de formatação do pai e adiciona seus próprios detalhes por cima, evitando a duplicação de código e criando uma saída mais rica.
Experimente você mesmo
<?php
require_once 'ElectronicProduct.php';
// Ler entradas
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Criar um ElectronicProduct com os valores de entrada
// e imprimir o resultado da chamada de getDetails()
?>Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodoA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em DetalhesGetters e SettersOcultação de InformaçãoPromoção de Construtor (8.0)Recapitulação - Sistema de Registro de Alunos10Conceitos Avançados de POO
Composição vs HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibers (PHP 8.1)Mergulho Profundo em Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA Palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto Organizado5Interfaces e Contratos
Introdução a InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataType Hinting com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos AnuláveisTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadasTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário3Propriedades de Classe
Propriedades de Instância vs EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Readonly (PHP 8.1)Recapitulação - Gerenciador de Conta Bancária6Polimorfismo
Sobrescrita de Métodos RevisitadaPolimorfismo via InterfacesType Hinting e Union TypesLate Static BindingRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos de TraitsMétodos Abstratos em TraitsTraits vs Herança12Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online