PHP

Dominando Herança e Polimorfismo em PHP em Projetos Reais

7 min de leitura

Dominando Herança e Polimorfismo em PHP em Projetos Reais

Herança em PHP: Fundamentos e Prática Herança é um dos pilares da Programação Orientada a Objetos. Permite que uma classe filha herde atributos e métodos de uma classe pai, eliminando duplicação de código e criando hierarquias lógicas. Em PHP, usamos a palavra-chave para estabelecer essa relação. Note que usamos para atributos que a classe filha precisa acessar, e para chamar métodos da classe pai. Isso garante encapsulamento sem bloquear o acesso necessário. Visibilidade e Modificadores A escolha correta entre , e é fundamental. Use para membros que classes filhas devem acessar, para dados sensíveis que nunca mudarão, e apenas quando necessário expor a interface. Polimorfismo: Múltiplas Formas, Uma Interface Polimorfismo permite que objetos de diferentes classes respondam ao mesmo método de formas distintas. É a capacidade de uma classe filha sobrescrever (override) métodos da classe pai, mantendo a mesma assinatura. Aqui usamos uma classe com um método , forçando que subclasses implementem . Cada animal responde diferentemente ao mesmo método.

<h2>Herança em PHP: Fundamentos e Prática</h2>

<p>Herança é um dos pilares da Programação Orientada a Objetos. Permite que uma classe filha herde atributos e métodos de uma classe pai, eliminando duplicação de código e criando hierarquias lógicas. Em PHP, usamos a palavra-chave <code>extends</code> para estabelecer essa relação.</p>

<pre><code class="language-php">class Veiculo {

protected $marca;

protected $velocidade = 0;

public function __construct($marca) {

$this-&gt;marca = $marca;

}

public function acelerar() {

$this-&gt;velocidade += 10;

return &quot;Acelerou para {$this-&gt;velocidade} km/h&quot;;

}

public function getMarca() {

return $this-&gt;marca;

}

}

class Carro extends Veiculo {

private $portas;

public function __construct($marca, $portas) {

parent::__construct($marca);

$this-&gt;portas = $portas;

}

public function abrirBagagem() {

return &quot;Bagagem aberta no {$this-&gt;marca}&quot;;

}

}

$carro = new Carro(&quot;Toyota&quot;, 4);

echo $carro-&gt;acelerar(); // Acelerou para 10 km/h

echo $carro-&gt;abrirBagagem(); // Bagagem aberta no Toyota</code></pre>

<p>Note que usamos <code>protected</code> para atributos que a classe filha precisa acessar, e <code>parent::</code> para chamar métodos da classe pai. Isso garante encapsulamento sem bloquear o acesso necessário.</p>

<h3>Visibilidade e Modificadores</h3>

<p>A escolha correta entre <code>public</code>, <code>protected</code> e <code>private</code> é fundamental. Use <code>protected</code> para membros que classes filhas devem acessar, <code>private</code> para dados sensíveis que nunca mudarão, e <code>public</code> apenas quando necessário expor a interface.</p>

<h2>Polimorfismo: Múltiplas Formas, Uma Interface</h2>

<p>Polimorfismo permite que objetos de diferentes classes respondam ao mesmo método de formas distintas. É a capacidade de uma classe filha sobrescrever (override) métodos da classe pai, mantendo a mesma assinatura.</p>

<pre><code class="language-php">abstract class Animal {

protected $nome;

public function __construct($nome) {

$this-&gt;nome = $nome;

}

abstract public function fazer_som();

public function apresentar() {

return &quot;Sou o {$this-&gt;nome}&quot;;

}

}

class Cachorro extends Animal {

public function fazer_som() {

return &quot;{$this-&gt;nome} faz: Au au!&quot;;

}

}

class Gato extends Animal {

public function fazer_som() {

return &quot;{$this-&gt;nome} faz: Miau!&quot;;

}

}

$animais = [

new Cachorro(&quot;Rex&quot;),

new Gato(&quot;Félix&quot;)

];

foreach ($animais as $animal) {

echo $animal-&gt;fazer_som() . &quot;\n&quot;;

// Rex faz: Au au!

// Félix faz: Miau!

}</code></pre>

<p>Aqui usamos uma classe <code>abstract</code> com um método <code>abstract</code>, forçando que subclasses implementem <code>fazer_som()</code>. Cada animal responde diferentemente ao mesmo método. Isso é polimorfismo em ação.</p>

<h3>Tipagem e Type Hints</h3>

<p>PHP 7+ permite definir tipos de retorno e parâmetros. Combine isso com polimorfismo para código mais robusto:</p>

<pre><code class="language-php">interface Voo {

public function decolar(): string;

public function pousar(): string;

}

class Aviao implements Voo {

public function decolar(): string {

return &quot;Avião decolando...&quot;;

}

public function pousar(): string {

return &quot;Avião pousando...&quot;;

}

}

function executarVoo(Voo $veiculo): void {

echo $veiculo-&gt;decolar() . &quot;\n&quot;;

echo $veiculo-&gt;pousar() . &quot;\n&quot;;

}

executarVoo(new Aviao());</code></pre>

<p>Usando <code>interface</code> e type hints, garantimos que qualquer classe que implemente <code>Voo</code> funcionará com <code>executarVoo()</code>. Isso é polimorfismo paramétrico.</p>

<h2>Casos Práticos: Quando Usar</h2>

<h3>Herança vs. Composição</h3>

<p>Nem sempre herança é a melhor solução. Prefira composição quando a relação não é claramente &quot;é um(a)&quot;:</p>

<pre><code class="language-php"></code></pre>

<p>Use herança para relações &quot;é um(a)&quot; (Carro é Veiculo) e composição para relações &quot;tem um(a)&quot; (Carro tem Motor).</p>

<h3>Exemplo Real: Sistema de Pagamento</h3>

<pre><code class="language-php">abstract class Pagamento {

protected $valor;

protected $status = &#039;pendente&#039;;

public function __construct($valor) {

$this-&gt;valor = $valor;

}

abstract public function processar(): bool;

public function getStatus(): string {

return $this-&gt;status;

}

}

class PagamentoCartao extends Pagamento {

private $numero;

public function __construct($valor, $numero) {

parent::__construct($valor);

$this-&gt;numero = $numero;

}

public function processar(): bool {

// Simula validação

if (strlen($this-&gt;numero) === 16) {

$this-&gt;status = &#039;aprovado&#039;;

return true;

}

$this-&gt;status = &#039;rejeitado&#039;;

return false;

}

}

class PagamentoPixel extends Pagamento {

public function processar(): bool {

$this-&gt;status = &#039;aprovado&#039;;

return true;

}

}

function realizarVenda(Pagamento $metodo): void {

if ($metodo-&gt;processar()) {

echo &quot;Venda finalizada - Status: &quot; . $metodo-&gt;getStatus();

} else {

echo &quot;Falha na venda - Status: &quot; . $metodo-&gt;getStatus();

}

}

realizarVenda(new PagamentoCartao(150, &#039;1234567890123456&#039;));

realizarVenda(new PagamentoPixel(200));</code></pre>

<p>Este exemplo mostra como polimorfismo permite adicionar novos métodos de pagamento sem modificar <code>realizarVenda()</code>. Respeita o princípio Open/Closed.</p>

<h2>Conclusão</h2>

<p>Herança e polimorfismo são ferramentas poderosas quando usadas corretamente. <strong>Primeiro aprendizado</strong>: use herança para relações hierárquicas reais, não para reutilização de código superficial. <strong>Segundo</strong>: polimorfismo permite escrever código flexível e extensível que funciona com múltiplas classes através da mesma interface. <strong>Terceiro</strong>: combine com interfaces e classes abstratas para criar contratos claros e manuteníveis. Dominar esses conceitos elevará significativamente a qualidade da sua arquitetura de software.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://www.php.net/manual/pt_BR/language.oop5.php" target="_blank" rel="noopener noreferrer">PHP: Classes e Objetos - Documentação Oficial</a></li>

<li><a href="https://www.php.net/manual/pt_BR/language.oop5.inheritance.php" target="_blank" rel="noopener noreferrer">PHP: Herança - Manual</a></li>

<li><a href="https://www.php.net/manual/pt_BR/language.oop5.interfaces.php" target="_blank" rel="noopener noreferrer">PHP: Interfaces - Manual</a></li>

<li><a href="https://laracasts.com/series/object-oriented-bootcamp-in-php" target="_blank" rel="noopener noreferrer">SOLID Principles in PHP - Laracasts</a></li>

<li><a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank" rel="noopener noreferrer">Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin</a></li>

</ul>

Comentários

Mais em PHP

Upload de Arquivos com PHP: Validação e Segurança na Prática
Upload de Arquivos com PHP: Validação e Segurança na Prática

Upload de Arquivos com PHP: Validação e Segurança Upload de arquivos é uma fu...

CRUD Completo com PDO: Create, Read, Update, Delete: Do Básico ao Avançado
CRUD Completo com PDO: Create, Read, Update, Delete: Do Básico ao Avançado

Preparando o Ambiente: Conexão com PDO A PDO (PHP Data Objects) é uma camada...

Boas Práticas de Superglobais em PHP: $_GET, $_POST, $_SESSION e $_COOKIE para Times Ágeis
Boas Práticas de Superglobais em PHP: $_GET, $_POST, $_SESSION e $_COOKIE para Times Ágeis

Compreendendo as Superglobais em PHP As superglobais são variáveis especiais...