Os 3 Pilares da POO: Polimorfismo, Herança e Encapsulamento em PHP
Neste tutorial, vamos estudar de forma profunda as maiores vantagens da orientação a objetos: o **Polimorfismo**, a **Herança** e o **Encapsulamento**. Se você quer deixar de ser um programador que faz apenas "scripts soltos" e passar a construir arquiteturas de software de nível empresarial (como ERPs e APIs bancárias), você precisa dominar esses três pilares.A base da Programação Orientada a Objetos se apoia em 3 conceitos principais: Herança (capacidade de uma classe herdar características de outra), Polimorfismo (capacidade de objetos diferentes executarem métodos com o mesmo nome de formas diferentes) e Encapsulamento (proteção e ocultação dos dados internos de um objeto).
Polimorfismo em Orientação a Objetos
A palavra tem origem grega: Poli quer dizer "várias", e morfos significa "forma" ou "maneira". Ou seja, **polimorfismo quer dizer várias maneiras de fazer a mesma coisa**, e essa é uma das características mais poderosas e elegantes da orientação a objetos. Imagine um sistema de controle logístico onde temos a classe abstrata `Automovel` com a função `ligar()`. Ora, a maneira de ligar um carro é diferente da maneira de ligar uma moto, que é diferente da maneira de ligar um triciclo e é absurdamente diferente de ligar uma mobilete velha. Mas perceba: **todos são automóveis, todos ligam, e todos possuem a função (método) ligar()**. Então, ao executar o método `ligar()` de um carro ou de uma moto no seu código, ele vai ligar. Pode ser de uma maneira ou de outra, usando regras de negócio distintas internamente, mas vai ligar. Isso é a capacidade de fazer algo de maneiras diferentes respeitando um mesmo "contrato".O Polimorfismo no Código PHP
Se você tem um objeto chamado `$moto`, para ligar ela, vai acionar: `$moto->ligar();`. Se tem uma BMW, vai chamar o mesmo método: `$bmw->ligar();`. Veja como isso funciona num ecossistema real de código usando Interfaces:
<?php
// Definimos a regra de ouro: todo automóvel DEVE ter um método ligar()
interface Automovel {
public function ligar();
}
// A classe Carro implementa a regra do seu jeito
class Carro implements Automovel {
public function ligar() {
return "Carro ligando: Injetando combustível, girando chave da ignição... Vrum!";
}
}
// A classe Moto implementa a mesma regra, mas de forma diferente
class Moto implements Automovel {
public function ligar() {
return "Moto ligando: Apertando embreagem, injetando faísca... Rãdãdãdã!";
}
}
// Usando o Polimorfismo na prática:
$meuCarro = new Carro();
$minhaMoto = new Moto();
// O mesmo comando, resultados diferentes!
echo $meuCarro->ligar() . "<br>";
echo $minhaMoto->ligar();
?>
Caminhao implementando a interface. O resto do sistema continua funcionando sem você precisar alterar códigos antigos!
Herança em Orientação a Objetos
Uma das características mais interessantes da POO para economia de tempo é a herança. É a capacidade que uma classe tem de herdar informações, atributos e métodos de outras classes superiores. Vamos supor o desenvolvimento do sistema de RH de uma grande empresa. Criamos a classe base `Funcionario`. O que todos os funcionários têm em comum? Ué, salário, horário de trabalho, matrícula corporativa e tarefas a fazer... Porém, cada funcionário, de cada setor, tem responsabilidades e permissões específicas:- Os funcionários de TI herdam as características da classe `Funcionario` (têm salário e horários), mas possuem o método extra de acessar os servidores.
- Os Entregadores também herdam essas características, mas não ficam dentro da empresa, logo, possuem métodos extras para rastreio de frota e GPS.
- O Presidente (CEO) também é um funcionário e herda o salário, mas o dele possui bônus de participação nos lucros.
Aplicando Herança no PHP
Com o uso da palavra reservada `extends`, você poupa a reescrita de código. Veja como fica o nosso RH corporativo:
<?php
// Superclasse (A base de todos)
class Funcionario {
public $nome;
public $salarioBase;
public function __construct($nome, $salarioBase) {
$this->nome = $nome;
$this->salarioBase = $salarioBase;
}
public function baterPonto() {
return "{$this->nome} bateu o ponto às 08:00.";
}
}
// Subclasse (Herdando do Funcionario)
class FuncionarioTI extends Funcionario {
// Método exclusivo da equipe de TI
public function acessarServidor() {
return "Acesso Root Liberado para {$this->nome}.";
}
}
// Testando a Herança
$dev = new FuncionarioTI("Ana Silva", 6500.00);
// A Ana (Subclasse TI) pode usar um método que foi escrito apenas na Superclasse (Funcionario)
echo $dev->baterPonto() . "<br>";
// E também usa o método que é exclusivo dela
echo $dev->acessarServidor();
?>
FuncionarioTI > Suporte > Nivel1 > EstagiarioNivel1), o código fica impossível de dar manutenção. Na arquitetura de software moderna, damos preferência à "Composição sobre Herança".
Encapsulamento: O Escudo de Proteção do Código
Até o momento (antes da POO), todo o nosso código PHP eram "pedaços" soltos. Uma função solta aqui, um formulário HTML acolá, e as coisas meio que iam se encaixando através de includes.
Uma função genérica escrita de forma procedural é acessível para o script inteiro, qualquer um pode ter acesso a ela e usar como bem entender. E isso no mundo corporativo é perigoso. A galera da TI não deveria ter acesso irrestrito às funções e dados expostos da galera do setor da Tesouraria (que lida com fluxo de caixa), concorda?
É aí que entra o Encapsulamento.
Quando criamos uma classe, definimos atributos e ações. O Encapsulamento garante que somente os próprios objetos tenham acesso aos seus dados internos mais sensíveis.
O que acontece no Motor fica no Motor. Os atributos internos do motor de um carro não são diretamente acessíveis pelo objeto do ar-condicionado; assim, uma pane elétrica do ar não consegue reescrever a variável de combustível do motor e explodir o carro. É cada um no seu quadrado usando modificadores de visibilidade (public, private, protected).
Encapsulamento Bancário (Código PHP e Visibilidade)
Veja um clássico erro de segurança evitado pelo encapsulamento:
<?php
class ContaBancaria {
// PRIVATE: Ninguém de fora da classe pode ler ou alterar essa variável!
private $saldo;
public function __construct($saldoInicial) {
$this->saldo = $saldoInicial;
}
// A única forma de alterar o saldo é passando pelas regras desse método PÚBLICO
public function sacar($valor) {
if ($valor <= $this->saldo) {
$this->saldo -= $valor;
return "Saque de R$ {$valor} efetuado. Saldo atual: R$ {$this->saldo}";
} else {
return "Erro: Saldo insuficiente. Calote negado!";
}
}
}
$minhaConta = new ContaBancaria(1000);
// Tentativa de roubo hacker alterando a variável diretamente:
// $minhaConta->saldo = 50000; // ISSO GERA UM ERRO FATAL NO PHP! (Cannot access private property)
// Forma correta e segura de interagir (através dos métodos da classe):
echo $minhaConta->sacar(200);
?>
⚙️ Teste na Prática: Tente Hackear o Encapsulamento
Para que você nunca esqueça esse conceito, tente burlar o sistema abaixo. Se o saldo for privado, a alteração direta será bloqueada!API Bancária Simulada
Saldo Inicial: R$ 1.000,00
Torne-se o Profissional que as Empresas Procuram! 🏆
Lógica orientada a objetos fica incrivelmente mais fácil quando você entende a conexão entre Front-end e Back-end. No Mega Pack do Projeto Progressivo, você leva 7 apostilas premium para dominar PHP, C, Java, HTML, CSS e JavaScript por um valor irrisório.
Consolide seu Conhecimento (O que estudar a seguir)
Criar um bom código não é acidente, é arquitetura de dados! Se você sentiu dificuldades ou quer reforçar a base, sugiro acessar este silenciamento de conteúdo:- Reforço: Ainda confunde instâncias com moldes? Volte e revise O que são Classes e Objetos em PHP.
- Oficial: A documentação é o manual definitivo do programador. Leia sobre Visibilidade (Encapsulamento) no Manual do PHP.
- Avanço: Na próxima aula, vamos destrinchar como criar arquivos separados para organizar essas classes usando Namespaces e Autoload no PHP.
Nenhum comentário:
Postar um comentário