Curso de PHP Orientado a Objetos – Parte 3

Slide1Terceiro 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
 
Assim como no mundo real, a palavra se refere ao conceito de receber algo, herança aqui pode ser entendida como um mecanismo que permite construir uma nova classe com base em uma classe previamente existente, em que a nova herda automaticamente todos os atributos, comportamentos e implementações da classe-pai. 
Quando se trata de herança, estamos falando de um dos maiores benefícios da Orientação a Objetos, além da capacidade de encapsulamento (essa veremos a seguir, por enquanto, trate o encapsulamento como algo importante). Com a herança, podemos reutilizar partes de código já definidas, além da agilidade, ela elimina a necessidade de duplicar ou rescrever certo código. Essas características nos permitem ao invés de escrevermos uma estrutura totalmente nova, reaproveitar a estrutura existente mesmo que a mesma nos forneça apenas uma base abstrata para o desenvolvimento.
 
Para estender uma nova classe (chamaremos de subclasse), utilizamos a palavra reservada extends. 
Quando criamos uma subclasse, todos os métodos pertencentes a classe pai podem ser executados. Também é possível sobrescrever os seus métodos e propriedades, a fim de criar novos, com outras características. Se na subclasse é escrito um método com o mesmo nome do método existente na classe pai, passa a vigorar o método da classe filha (subclasse).
 
Para acessar os métodos sobrescritos ou membros estáticos da classe pai, utilizamos a palavra reservada parent.
 
É importante destacar que somente os métodos protect e public podem ser reescritos (veremos detalhes sobre isso mais a frente).
 
Nada melhor que um exemplo para facilitar o entendimento por isso, vamos retornar a nossa classe pessoa e a partir dela criaremos a classe funcionário, pois o funcionário é uma pessoa, consequentemente, funcionário herdará as características da classe pessoa, ao invés de duplicarmos tudo de novo na classe funcionário.



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:


Testando nosso exemplo de herança:

 

 

Para um melhor entendimento, você deve colocar em prática os exemplos, analisar e estuda-los. 

Vamos começar analisando a classe Funcionário:

Nesta linha estamos adicionando a classe pessoa ao documento, levando em consideração que a classe pessoa está em outro arquivo.

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.

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:

Se você achou esta parte complicada, fique tranquilo, é mais simples do que parece.
Lembra que estamos trabalhando na classe Funcionário, que é uma subclasse de Pessoa, com isso, Funcionário possui todos os métodos de Pessoa. Vimos que o construtor também é um método, executado quando criamos o objeto e neste caso, estamos sobrescrevendo este construtor.
A linha 4 retrata exatamente isso, estamos dizendo que o pai (parent::) que irá receber os dados (nome, anodenascimento, endereco e telefone) e a classe Funcionário que ficará responsável pelos demais dados (salario, cargo e diadepagamento).
Se não declarássemos o método construtor na classe Funcionário, seria usado o da classe pai, ou seja, o método construtor de Pessoa.

 

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.

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!

 


28 Responses to Curso de PHP Orientado a Objetos – Parte 3

  1. Anonymous disse:

    ótimos tutoriais! Parabéns pela iniciativa meu amigo. Está me ajudando bastante

  2. Psykhe disse:

    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+

  3. Maurício Jr. disse:

    Ótimas postagens! Objetivo e claro. Parabéns e obrigado por compartilhar o seu conhecimento.

  4. pssilva disse:

    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?

  5. diego disse:

    Gastei uma grana fazendo curso de PHP OO, e não aprendi nada, agora fazendo esse curso, já to sabendo bem mais…
    Parabéns

  6. Guiga disse:

    poh to prendendu tudo com oce

  7. Patrick disse:

    oki sinifik crass????

  8. Kaique disse:

    AS MINA PIRA NO MEU PHP

  9. Matheus Coop disse:

    coloque essa krass e ta sainu fogo da minha pc

  10. Tayner Jhony disse:

    Muito bom, estou aplicando todos os conceitos abordados aqui nessas aulas obrigado pela iniciativa.

  11. Alex disse:

    muito boa explicação.

  12. Carlos Dutra disse:

    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

  13. Busch disse:

    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! ;-)

  14. Marcelo disse:

    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

    • rafael moura disse:

      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

  15. jonny disse:

    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}”;
    }

    • rafael moura disse:

      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

  16. To aqui igual a uma criança quando ganha um presente, feliz demais com esse curso. Didática perfeita. Vlw irmão!

  17. Artur disse:

    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;
    }

    • Stanley Sathler disse:

      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.

    • rafael moura disse:

      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..

  18. Denison disse:

    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á..

  19. José Nilton disse:

    Olá, Leandro! Nota dez! Não tem como não aprender, com essa didática excelente!

  20. rafael moura disse:

    Muito bom este site tem nos ajudado bastante valew pelo open knowlodge

  21. Ivan disse:

    Ótimo conteúdo, parabéns!
    abs

Deixe uma resposta para Tayner Jhony Cancelar resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *