Curso de PHP Orientado a Objetos – Parte 3
Terceiro artigo do curso de PHP Orientado a Objetos. Neste artigo vamos aprender o que é herança e como ela funciona no PHP.
Esta é a terceira parte do Curso de Php Orientado a Objetos.
Clique aqui para conhecer as partes anteriores.
Ao final deste artigo, você será capaz de:
- Entender e aplicar o conceito de herança
Herança
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
class Pessoa{ public $Nome; public $AnoDeNascimento; public $Endereco; public $Telefone; /* Método Construtor * Inicializa as propriedades */ function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone){ $this->Nome = $Nome; $this->AnoDeNascimento = $AnoDeNascimento; $this->Endereco = $Endereco; $this->Telefone = $Telefone; } /* Método EscreveDados() * Retorna os dados da Pessoa */ function EscreveDados(){ echo "Nome: {$this->Nome} Ano de nascimento: {$this->AnoDeNascimento} Endereço: {$this->Endereco} Telefone: {$this->Telefone}"; } /* Método ObterIdade() * Retorna a idade */ function ObterIdade(){ $ano_atual = date("Y",time()); return $ano_atual - $this->AnoDeNascimento; } } |
Caso você tenha dúvidas quanto a esta classe, consulte as aulas anteriores.
Agora vamos criar a classe Funcionário, que irá herdar da classe Pessoa, fique atendo aos comentários e não se preocupe caso não entenda alguma parte do código, iremos explicar detalhadamente em seguida:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
require_once("Pessoa.class.php"); class Funcionario extends Pessoa{ public $Salario; public $Cargo; public $DiaPagamento; /* Método Construtor * Inicializa as propriedades */ function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento){ // Chamada do método do construtor da classe-pai parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone); // Inicializa as variáveis/propriedades locais da Classe $this->Salario = $Salario; $this->Cargo = $Cargo; $this->DiaPagamento = $DiaPagamento; } /* Método EscreverSalario * Escreve o salário do funcionário */ function EscreverSalario(){ echo "Salário: {$this->$Salario} "; } /* Método EscreveDados() * Este método sobrescreve o método EscreveDados() da classe-pai */ function EscreveDados(){ parent::EscreveDados(); echo "Salário: {$this->Salario} Cargo: {$this->Cargo} Dia de pagamento: {$this->DiaPagamento} "; } } |
Testando nosso exemplo de herança:
1 2 3 4 5 6 7 8 9 |
<span style="font-family: Verdana, sans-serif;"> require_once("Funcionario.class.php"); $leandro = new Funcionario("Leandro Castro", 1985, "Rua das Flores 33 - Juiz de fora","(32) 3232-3535", 4.000, "Desenvolvedor Java/PHP", 8); echo $leandro->ObterIdade(); $leandro->EscreveDados(); </span> |
Vamos começar analisando a classe Funcionário:
1 |
require_once("Pessoa.class.php"); |
Nesta linha estamos adicionando a classe pessoa ao documento, levando em consideração que a classe pessoa está em outro arquivo.
1 |
class Funcionario extends Pessoa{ |
Nesta linha estamos dizendo que a classe Funcionário herdará todas as características de Pessoa. Desta forma, Pessoa será a superclasse, enquanto Funcionário, a subclasse de Pessoa.
1 2 3 |
public $Salario; public $Cargo; public $DiaPagamento; |
Nesta parte declaramos as propriedades do Funcionário. Mas funcionário não teria que ter um nome? Deixamos de criar a propriedade nome pois ela já está criada na classe Pessoa, consequentemente a classe Funcionário herdou essa propriedade, sendo assim, não é necessário cria-la novamente.
Continuando:
1 2 3 4 |
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento){ // Chamada do método do construtor da classe-pai parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone); |
1 2 3 4 5 6 7 |
function EscreverSalario(){ echo "Salário: {$this->$Salario} "; } |
Se você esta estudando com atenção, percebeu que este método foi uma nova implementação, ele não exsite na classe pai, pois além de herdar, você pode criar novos métodos e propriedades.
1 2 3 4 5 6 7 8 9 10 |
function EscreveDados(){ parent::EscreveDados(); echo "Salário: {$this->Salario} Cargo: {$this->Cargo} Dia de pagamento: {$this->DiaPagamento} "; } |
Esta parte também é importante, perceba que o método EscreveDados existe na classe pai (volte e verifique) mas foi sobrescrito, e acrescentamos a impressão dos campos de salário, cargo e diadepagamento. Neste caso, será impresso todos os atributos contidos na classe pai (parent::) no método EscreveDados, e também os atributos do método EscreveDados da classe filha, ou seja, um complemento do método pai.
Vale lembrar que o PHP não suporta herança múltipla, isso pode ser feito com o uso de interfaces (veremos no futuro).
Conclusão:
Com este recurso, expandimos nosso código, sem reescreve-lo, isso é extremamente comum quando se trata de criar novas funcionalidades em um software.
Cabe a você estudar e aplicar os conceitos que aprendeu aqui.
Utilize o espaço de comentários para tirar suas dúvidas.
No próximo artigo, veremos o polimorfismo (de forma descomplicada).
Até la!
ótimos tutoriais! Parabéns pela iniciativa meu amigo. Está me ajudando bastante
function EscreveDados(){
parent::EscreveDados();
echo “Salário: {$this->Salario}
Cargo: {$this->Cargo}
Dia de pagamento: {$this->DiaPagamento} “;
}
Bem este metodo se ignorado o parent, seria um polimorfismo?
Porque o uso do parent?
Acho que to enrolando as coisas,
Forte abraços,
T+
ah nao o parent, ta certo, ele vai herdar o conteudo do metodo e mais o implementado.
o polimorfismo apenas o substitui.
acho que é isso.
Exatamente Psykhe.
O parent vai “complementar” o método. Acho que você já entendeu
Ótimas postagens! Objetivo e claro. Parabéns e obrigado por compartilhar o seu conhecimento.
Bao tarde!
Gostei do artigo.
Mas tenho um dúvida.
Criar um objeto da classe A dentro da classe B de mesmo pai, isto é, as classes A e B são de mesmo pai. o que ocorre?
Na verdade ocorreu comigo e aqui, não dá erro, mas também não mostra nada. Não encontrei ainda o porque, mas tenho este palpite. Talvez seja porque as classes sejam do mesmo pai. O que vcs acham?
Gastei uma grana fazendo curso de PHP OO, e não aprendi nada, agora fazendo esse curso, já to sabendo bem mais…
Parabéns
poh to prendendu tudo com oce
oki sinifik crass????
AS MINA PIRA NO MEU PHP
coloque essa krass e ta sainu fogo da minha pc
Muito bom, estou aplicando todos os conceitos abordados aqui nessas aulas obrigado pela iniciativa.
muito boa explicação.
olá, a minha duvida maior é como ultilizar orientação objetos quando se trata de dados do banco de dados
sql e mysql
estou tendo esta dificuldade, pois estar me parecendo melhor usar apenas funções sem classes
obrigado
Excelente!!!
Estou migrando para POO. É confuso pra mim, que venho da POG hahahahha Mas vc é o cara, melhor aula virtual de POO da Web!!
Parabéns!
Excelente artigo, porém eu testei aqui a herança não funcionou. A classe pessoa rodou 100%, agora se eu tentar usar funcionário a tela aparece em branco não traz nada….Alguém passou por isso ?
Abs
Depende, se vc salvou seus arquivos assim : pessoa.class.php e funcionario.class.php vc tem que incluir no arquivo funcionario.class.php logo no inicio da pagina a classe pessoa assim: require_once “funcionario.class.php”
outra coisa, se estiver na mesma pasta ou pasta raiz, ou seja, se for irmã dela esta incllusão está correta mas se estiver em outra pasta atentar para isto talvez seja este o erro eu
Primeiro gostaria de parabeniza sua iniciativa
uma pergunta seu usar {$this->AnoDeNascimento} com as cravas e um template pode apresentar erro ?
por exemplo templetes free
function EscreveDados(){
echo “Nome: {$this->Nome}
Ano de nascimento: {$this->AnoDeNascimento}
Endereço: {$this->Endereco}
Telefone: {$this->Telefone}”;
}
vc pode utilizar em qualquer template desde que a extensão do arquivo seja .php ou seja o arquivo seja em php para que ele possa interpretar esta linguagem, se não salvar em php, o navegador não irá traduzir o código e não mostrará nada
To aqui igual a uma criança quando ganha um presente, feliz demais com esse curso. Didática perfeita. Vlw irmão!
No código abaixo utilizando construtores, porque tenho de declarar duas vezes as variáveis Nome, $AnoDeNascimento, $Endereco, $Telefone, – em ambos os construtores (com e sem parent)- se elas já foram inicialiazadas na classe pai?
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento){
// Chamada do método do construtor da classe-pai
parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone);
// Inicializa as variáveis/propriedades locais da Classe
$this->Salario = $Salario;
$this->Cargo = $Cargo;
$this->DiaPagamento = $DiaPagamento;
}
Oi Artur,
Quando você instancia um objeto da classe filho – no caso, Funcionario – você armazenará os argumentos nas variáveis da function __construct() (construct() sem parent::, como você disse).
A partir daí, você simplesmente transfere esses valores para o __construct() pai (parent::__construct()), para simplesmente não ter que reescrevê-lo novamente.
Como nosso amigo já respondeu pra vc amigo, mas so reforçando, vc passa os valores quando vc instancia a classe filho (funcionario) assim:
$leandro = new Funcionario(“Leandro Castro”, 1985, “Rua das Flores 33 – Juiz de fora”,”(32) 3232-3535″, 4.000, “Desenvolvedor Java/PHP”, 8);
esses valores caem todos aqui :
function __construct($Nome, $AnoDeNascimento, $Endereco, $Telefone, $Salario, $Cargo, $DiaPagamento)
usando de metáfora:
como nesta classe não criamos os atributos $nome, $AnoDeNascimento,$Endereço e $Telefone, claro, estão em outra classe, o pc vai te pergunta “- ei, onde estão estes atributos ai?”
vc responde: “- estão na classe pai!”… atravez do comando parent::__construct($Nome, $AnoDeNascimento, $Endereco, $Telefone);
espero que esta brincadeira tenha explicado bem..
Excelente conteúdo, não estava intendendo muito bem, agra estou pegando certinho .. mas o meu não apareceu nem o Salario nem o Cargo e nem o dia do pagamento .. o que Houve?
Obrigado desde já..
Já encontrei o erro.. Obrigado kk
Olá, Leandro! Nota dez! Não tem como não aprender, com essa didática excelente!
Muito bom este site tem nos ajudado bastante valew pelo open knowlodge
Ótimo conteúdo, parabéns!
abs