NOME DURAÇÃO
Curso PHP
Abertura do Curso de PHP
Visão Geral do PHP
Ambiente de Desenvolvimento PHP
Servidor Web PHP
Como instalar o WAMP no Windows - Curso de PHP
Instalando PHPStorm no Windows
URL e Apache com PHP
Hello World em PHP
Executando Scripts PHP
TAG PHP
Montagem do HTML com PHP
Montagem do HTML com PHP II
Comentários em PHP
Definições da Linguagem PHP
Variáveis em PHP
Variáveis em PHP II
Nomenclatura de Variáveis em PHP
Operadores Aritméticos em PHP
Tipos de Dados do PHP
Módulo da Divisão em PHP
Tomada de Decisão em PHP
Tomada de Decisão - Estrutura else
Ambiente para Estudo PHP
Números Pares e Ímpares em PHP
A instrução elseif
Operadores Relacionais em PHP
Operadores Relacionais Parte II
Operadores Lógicos em PHP
Tela de Login e Senha com PHP
Introdução às Estruturas de Repetição em PHP
Instrução While em PHP
Introdução do-while em PHP
do-while - caso de uso com PHP
Script em Looping em PHP
Atribuição vs Comparação vs Identico em PHP
Operadores de Atribuição Compostos em PHP
Operadores de Incremento e Decremento em PHP
Estrutura de Repetição for do PHP
Estrutura de Repetição for do PHP (parte II)
Tabuada em PHP
Instrução break em PHP
Instrução continue em PHP
Operação Ternária em PHP
Operação Ternária em PHP (parte II)
Estrutura de Seleção Múltipla switch em PHP
Estrutura de Seleção Múltipla switch em PHP (parte II)
Precedência e Associatividade de Operadores em PHP
Constantes em PHP
Variáveis Variáveis em PHP
Introdução aos Arrays em PHP
Arrays Indexados em PHP
Definindo, Incluindo, Alterando e Excluindo elementos em PHP
Função range() em PHP
Iterando Arrays em PHP
Estrutura foreach em PHP
O foreach em PHP - Como usar?
Estrutura foreach - alterando valores internos
Arrays Associativos em PHP
Arrays Multidimensionais em PHP
Manipulação de Arrays em PHP
Introdução às Funções em PHP
Definindo parâmetros em PHP
Parâmetros default com PHP
Lista de Parâmetros em PHP
Lista de Parâmetros em PHP II
Funções variádicas em PHP
Retorno de Valores pela função em PHP
Funções e Escopo de Variáveis em PHP
Parâmetros por Referência em PHP
Parâmetros por Referência em PHP II
Parâmetros Tipados em PHP
Valores de retornos de funções tipados em PHP
Null Coalescing Operator em PHP
Operador SpaceShift em PHP
Importação: include() e require() do PHP
Introdução às Funções Anônimas em PHP
Escopo de nomes das funções anônimas em PHP
Funções Anônimas na Prática com PHP
Funções Anônimas e Arrays com PHP
Introdução às Strings em PHP
Aspas Duplas vs Aspas Simples em PHP
String Aspas Duplas em PHP
String heredoc e nowdoc em PHP
Funções para Manipulação de Strings em PHP
Introdução às Requisições Web em PHP
Método GET em PHP
Formulários HTML e PHP
Método POST com PHP
Variáveis superglobais do PHP
A Orientação a Objetos em PHP
Primeira Classe em PHP
Membros de Classe em PHP
Criação de Objetos em PHP
Acessando Membros de Classe em PHP
Implementando Comportamentos de Classe com PHP
Pseudo-variável $this em PHP
Gerenciando Atributos de Classe em PHP
Construtores em PHP
Construtores Personalizados em PHP
Destrutores em PHP
Encapsulamento em PHP
Encapsulamento em PHP (parte II)
Herança em PHP
Herança com PHP II
Modificadores de Acesso em PHP
Visibilidade das Funções em PHP
Funções Modificadoras em PHP
Sobrescrita de Funções em PHP

Nesta aula estudaremos o conceito de herança segundo a Orientação a Objetos. Em seguida, faremos um exemplo para estudarmos a aplicação do conceito da herança em uma situação real.

HERANÇA

A herança representa uma das principais características da Orientação a Objetos, até porque, somos capazes de implementar tipos de dados hierarquicamente. Através do conceito de herança, conseguimos implementar classes de uso geral, que possuam características comuns a várias entidades relacionadas.

Essas classes poderão ser estendidas por outras, produzindo assim, classes mais especializadas e, que implementem funcionalidades que as tornam únicas.

Através da herança, poderemos utilizar propriedades e métodos definidos na superclasse. Uma boa maneira de pensarmos neste conceito é sob a perspectiva de obter objetos mais especializados conforme aumente a hierarquia. Devemos tomar cuidado com o conceito de hereditariedade animal, até porque, os filhotes não possuem, necessariamente, as características dos pais. Já, o conceito de herança na Orientação a Objetos define que, todo herdeiro receberá o conjunto de características definidas como público e privado e, terá acesso total as funcionalidades definidas na superclasse. Assim, a única maneira de restringir os herdeiros é definindo membros privados, até porque, do contrário, todo e qualquer herdeiro poderá alterar quaisquer informação.

É comum que classes derivadas sejam novamente utilizadas como base para outras. Assim, somos capazes de estender qualquer classe que não tenha o seu construtor definido como privado.

Se tomarmos como exemplo a ideia de frutas, temos que a classe fruta conterá o código que define as propriedades e funções de todas as frutas, enquanto que a classe Maçã, receberá as funções e atributos de todas as frutas, e implementará as propriedades e funções que somente as maçãs possuem.

Toda classe poderá ser herdada e para isso, não é preciso fazer nada de especial, ou seja, o uso da herança se resume a definição explicita na declaração de uma nova classe que a mesma será uma "continuação" de outra.

Classes que são herdadas são chamadas de Classe Base, Super, SuperClasse. Classe herdeira são chamadas de Classes Derivadas, ou SubClasse. Também é comum chamarmos as classes base de superclasses, e as classes que herdam desta, como sendo subclasses.

O PHP não suporta herança múltipla, porém, o mesmo disponibiliza a utilização de traits, que permite a definição de conjuntos de características. Traits serão estudadas posteriormente e também, não podemos confundir o conceito de herança múltipla com traits, até porque, numa análise superficial há semelhanças, mas em teoria, são conceitos distintos.

A SINTAXE PARA USO DA HERANÇA

Uma classe herdeira, deverá, por definição, utilizar a instrução extends e, em seguida, definir a classe que será estendida. O código a seguir faz uma breve demonstração da nomenclatura que deve ser utilizada.

class Pai()
{

}

class Filho extends Pai
{
    #a classe filha utiliza a instrução `extends` e em seguida define
    # o nome da classe que está sendo estendida
}

Como podemos ver no trecho de código acima, a classe Pai está sendo estendida pela classe de nome Filha e, para isso, utilizou-se a instrução extends.

COMO A SUBCLASSE UTILIZA OS MEMBROS DA SUPER

Toda SubClasse poderá acessar os membros da super diretamente, como se estes membros tivessem sido declarados em seu corpo. Segundo a teoria da Orientação a Objetos, toda classe herdeira deve ter acesso direto ao membros públicos e protegidos da super.

Assim, salvo se lermos o código, não será possível saber em qual nível hierarquico que determinado membro foi definido.

class SuperClasse {

    public $a = 'variável $a';

    public function ola()
    {
        echo "SuperClasse->ola()";
    }
}

class SubClasse extends SuperClasse {

    #nada será declarado na SubClasse a fim de melhor entendermos
    # o funcionamento da herança de propriedades e funcionalidades

}

$super = new SuperClasse();
$super->ola();
$super->a = 10;

$sub = new SubClasse();
$sub->ola();
$sub->a = 10;

A visibilidade dos membros de classe será estudada em detalhes em aulas posteriores, porém, desde já tenha em mente que, classes herdeiras só são privadas de acessar os membros definidos como private, isto é, definidos como sendo privado!

No geral, todo herdeiro deve possuir acesso aos demais membros, sejam eles públicos ou protegidos.

HERANÇA NA PRÁTICA

Agora, vamos implementar as classes de Pessoa Física e Pessoa Jurídica e, ambas serão herdeiras da classe Pessoa. A ideia é que a classe Pessoa implemente o que é de uso comum entre as 2 definições de pessoas: física ou jurídicas. Enquanto que as classe PF e PJ implementem somente as informações referentes ao seu tipo de pessoa.

A ideia é ter um tipo de pessoa genérica e também, as pessoas especializadas, isso porque, um PF poderia, por exemplo, ser um paciente, um cliente, um vendedor, logo, seremos capazes de saber, por exemplo, as várias finalidades referentes a uma mesma Pessoa. Da mesma forma, temos que um PJ poderia ser um fornecedor, uma revenda, um cliente e etc.

É interessante observar que, um cliente, normalmente, pode ser tanto PF como também PJ. Assim, ao implementarmos o cadastro de Clientes, temos que disponibilizar ambas as opções o que atrapalhará o desenvolvimento. Por outro lado, uma mesma pessoa por ter 2 razões sociais, isto é, 2 CNPJ distintos e assim, a pessoa de maneira geral será a mesma para as 2 pessoas jurídicas distintas.

Existem alguma nomenclaturas distintas que encontraremos na literatura especializada da relação entre níveis diferentes das classes. Todas as terminologias aqui utilizadas forma retiradas do dicionário técnico eXcript.

Herança: capacidade de herdar as características de outra classe Classe: projeto de todo objeto - instância SuperClasse: a classe pai; classe que esta sendo estendida. SubClasse: nome da classe que está implementando outra. Classe-pai: classe utilizada como base para a criação de outras. Classe-base: sinônimo a SuperClasse

EXEMPLO FEITO EM AULA

# HERANÇA I

class SuperClasse{

    public $a = 'variável $a';

    public function ini(){
        echo "SuperClasse->ini()";
    }
}

class SubClasse extends SuperClasse{

}

$super = new SuperClasse();
$super->ini();
$super->a = "";

$sub = new SubClasse();
$sub->ini();
$sub->a = "qualquer valor";


Tags curso, php, programação orientada a objetos, poo, herança, encapsulamento, classe, objeto, instância, blog

Comentários

comments powered by Disqus