PHP
AULA 8ORIENTAÇÃO A OBJETOS
Professor: Leonardo Pereira E-mail: [email protected]
Facebook: leongamerti
Material de Estudo: http://www.leonti.vv.si
I
NTRODUÇÃOA orientação a objetos ou OO é o paradigma mais utilizado para construção de sistema.
Em vez de construir um sistema formado por um conjunto de funções e variáveis nem sempre agrupadas de acordo com o contexto, na OO utilizamos uma ótica mais próxima do mundo real. Lidamos com objetos, estruturas que já
conhecemos do nosso dia-a-dia e sobre as quais possuímos maior compreensão.
C
LASSES EO
BJETOSAo trabalharmos com orientação a objetos é fundamental entender o conceitos de classes e objetos.
Uma classe é uma estrutura que define um tipo de dados, podendo conter atributos e também métodos para manipular esses atributos.
Pense em uma classe como um “molde” para criar (instanciar) objetos.
C
LASSES EO
BJETOSVamos declarar uma classe chamada Produto com 4 propriedades.
Uma propriedade é uma variável que existe dentro do contexto de um objeto.
Para declarar uma classe usamos a palavra chave class.
Para declarar uma propriedade usamos a palavra chave var.
C
LASSEP
RODUTO <?php class Produto{ var $codigo; var $descricao; var $preco; var $quantidade; } ?>C
LASSES EO
BJETOSUm objeto contém exatamente a mesma estrutura de uma classe.
Por isso que falamos que a classe é o molde para um objeto.
No entanto, sua estrutura é dinâmica.
Seus atributos podem mudar de valor durante a execução do programa e podemos declarar diversos objetos oriundos de uma mesma classe. A classe é apenas o código fonte.
O objeto é um pedaço de um programa em execução na CPU e residente na memoria principal.
I
NCLUINDOC
ÓDIGOPara que um script contido em um arquivo separado possa ser usado, devemos chamá-lo utilizando uma das 4 funções abaixo:
include include_once require require_once
I
NCLUINDOC
ÓDIGOinclude: inclui um arquivo no escopo do programa tornando-se disponível a partir da linha em que a inclusão ocorre produzindo uma mensagem de advertência (warning) caso o arquivo não exista. include_once: funciona parecido com o include,
porém só inclui o arquivo apenas uma vez, sendo útil em casos em que programa pode passar mais de uma vez pela instrução.
require: similar ao include porém produz um erro fatal parando o processamento do código caso o arquivo não exista.
require_once: similar ao require, porém o arquivo só é incluído uma única vez.
C
LASSES EO
BJETOS<?php
include_once "classes/Produto.class.php"; $p = new Produto;
$p->codigo = 1000;
$p->descricao = "Mouse sem fio"; echo $p->codigo;
echo $p->descricao; ?>
C
LASSES EO
BJETOSNo exemplo primeiro importamos o código fonte da classe Produto usamos a função include. Depois criamos um objeto da classe Produto
usando o operador new seguido do nome da classe.
Para acessar as propriedades de um objeto em nosso programa, utilizamos o nome da
propriedade sem o $ precedido do nome do objeto.
M
ÉTODOSAgora vamos adicionar um método que é uma função declarada dentro da estrutura da classe. O método etiqueta() trabalha com as
propriedades do objeto.
Para diferenciar as propriedades de um objeto de variáveis locais, utiliza-se a pseudovariavel $thispara referenciar as propriedades do objeto que está executando o método.
M
ÉTODOS <?php class Produto{ var $codigo; var $descricao; var $preco; var $quantidade; function etiqueta(){echo "$this->codigo - $this->descricao"; }
} ?>
E
XECUTANDO UMM
ÉTODO<?php
include_once "classes/Produto.class.php"; $p = new Produto;
$p->codigo = 1000;
$p->descricao = "Mouse sem fio"; $p->etiqueta();
?>
// Saída é : 1000 – Mouse sem fio
Para executar um método é bem parecido com a atribuição de valor a uma propriedade.
C
LASSEÉ uma estrutura estática utilizada para
descrever objetos mediante atributos e métodos. A classe é um modelo para criação de objetos. Ao modelarmos uma classe Pessoa, suas
propriedades podem ser: nome, altura, idade, escolaridade e etc.
Os métodos são as funcionalidades desempenhadas pela casse.
No caso da classe Pessoa podemos ter os métodos falar(), crescer(), correr(), andar().
O
BJETOUm objeto é uma estrutura dinâmica originada com base em uma classe.
Um objeto também é conhecido como instancia de uma classe, porque o objeto existe durante um dado instante de tempo que vai da sua criação ate a sua destruição.
Podemos ter diversos objetos da classe Pessoa sendo que cada um pode possuir um valor diferente para suas respectivas propriedades.
M
ÉTODO COMR
ETORNO <?php class Produto{ var $codigo; var $descricao; var $preco; var $quantidade; function etiqueta(){echo "$this->codigo - $this->descricao"; }
function desconto($desconto){ $desconto = $desconto / 100; return $this->preco * $desconto; }
} ?>
M
ÉTODO COMR
ETORNOUm método pode retornar um valor quando for executado.
Para isso usamos a palavra return da mesma forma que usamos quando criamos uma função comum.
No final da execução do método, a instrução return devolve um determinado conteúdo para o chamador do método.
M
ÉTODO COMR
ETORNO<?php
include_once "classes/Produto.class.php"; $p = new Produto;
$p->codigo = 1000;
$p->descricao = "Mouse sem fio"; $p->preco = 700;
echo “{$p->desconto(20)} reais”; ?>
Saída: 140 reais.
O método desconto possui retorno por isso que usamos o
echo.
Ao executar um método entre aspas duplas é necessário
colocar a declaração entre chaves { }.
C
ONSTRUTORESUm construtor é um método especial usado para definir o comportamento inicial de um objeto. É executado automaticamente no momento em
que instanciamos um objeto por meio do operador new.
Não se deve retornar nenhum valor por meio deste método porque o seu retorno é o próprio objeto que está sendo instanciado.
Caso não seja definido um método construtor, automaticamente todas as propriedades do objeto criado são inicializados com NULL.
Para definir um método construtor declaramos o método __construct();
C
ONSTRUTORES <?php class Produto{ var $quantidade; function __construct(){ $this->quantidade = 100; } } ?>C
ONSTRUTORES <?php include_once "classes/Produto.class.php"; $p = new Produto; echo $p->quantidade; ?> Saída é: 100Agora, todo objeto criado possui inicial como quantidade o valor 100.
D
ESTRUTORESUm destrutor ou finalizador é um método especial executado automaticamente quando o objeto é retirado da memória..
Isso ocorre nos seguintes casos:
quando atribuímos o valor NULL ao objeto quando usamos a função unset() sobre o objeto quando o programa é finalizado.
Para definir um método destrutor em uma classe basta declarar o método __destruct().
D
ESTRUTORES <?php class Produto{ var $codigo; var $descricao; function etiqueta(){echo "$this->codigo - $this->descricao"; }
function __destruct(){
echo "Objeto destruído"; } } ?>
D
ESTRUTORES <?php include_once "classes/Produto.class.php"; $p = new Produto; $p->codigo = 100;$p->descricao = "Mouse sem fio"; echo $p->etiqueta();
?>
Saída é: 100 - Mouse sem fio Objeto destruído
A mensagem objeto destruído foi executado quando o script chegou no ponto ?>.
E
NCAPSULAMENTOÉ um mecanismo que fornece proteção de acesso aos membros internos de um objeto.
Existem certas propriedades de uma classe que devem ser tratadas exclusivamente por métodos dela mesma, que são implementações projetadas para manipular essas propriedades de forma correta.
As propriedades nunca devem ser acessadas
diretamente de forma do escopo de uma classe, pois dessa forma a classe não fornece mais garantias sobre os atributos que contem, perdendo, assim a responsabilidade sobre ele.
Os métodos devem ser projetados de forma a
protegerem suas propriedades, fornecendo interfaces para a manipulação destas.
E
NCAPSULAMENTOPara atingir o encapsulamento, podemos definir a visibilidade das propriedades e dos métodos de um objeto.
Existem 3 formas de acesso:
private: membros declarados como private somente podem ser acessados dentro da própria classe. protected: somente podem ser acessados dentro da
própria classe em que foram declarado e partir de classes filhas.
public: podem ser acessados livremente.
H
ERANÇAO uso da OO nos orienta em direção a uma maior organização de código, mas um dos maiores benefícios que encontramos na utilização desse paradigma é a possibilidade de reutilizar partes de código já definidas fornece maior agilidade no dia-a-dia.
Através da herança eliminamos a necessidade de eventuais duplicações ou reescritas de código.
H
ERANÇAUma herança cria uma arvore genealógica onde as classes inferiores da hierarquia herdam todas as propriedades e os métodos das classes
superiores, chamadas de superclasses. Este recurso tem uma aplicabilidade muito
grande, visto que é relativamente comum termos de criar novas funcionalidades em software. Utilizando a herança, em vez de criamos uma
estrutura totalmente nova, podemos reaproveitar uma estrutura já existente que nos fornece uma base abstrata para o desenvolvimento, provendo recursos básicos e comuns.
H
ERANÇAVamos criar uma classe genérica chamada Funcionário e aproveitar seu código fonte para criar uma classe mais específica chamada e Médico.
C
LASSEF
UNCIONÁRIO <?php class Funcionario{ protected $nome; protected $salario;public function setNome($n){ $this->nome = $n; }
public function getNome(){ return $this->nome; }
public function setSalario($s){ $this->salario = $s; }
public function getSalario(){ return $this->salario; } } ?>
C
LASSEM
EDICO <?php include_once "classes/Funcionario.class.php"; class Medico extends Funcionario{private $crm;
public function setCRM($c){ $this->crm = $c; }
public function getCRM(){ return $this->crm; }
public function cracha(){
echo "$this->nome - $this->crm"; }
public function getSalario(){ return $this->salario * 1.1; // return parent::getSalario() * 1.1; } } ?>
C
LASSEE
NGENHEIRO <?php include_once "classes/Funcionario.class.php"; class Engenheiro extends Funcionario{private $crea;
public function setCREA($c){ $this->crea = $c; }
public function getCREA(){ return $this->crea; }
public function cracha(){
echo "$this->nome - $this->crea"; }
} ?>
H
ERANÇA <?php include_once "classes/Medico.class.php"; include_once "classes/Engenheiro.class.php"; $m = new Medico(); $m->setNome("Patricia Silva"); $m->setCRM("331245-0"); $m->setSalario(1000); $m->cracha(); echo "<br>"; $e = new Engenheiro(); $e->setNome("Vitor Mendes"); $e->setCREA("123456-9"); $e->setSalario(1000); $e->cracha(); ?>S
OBRESCRITA OUO
VERRIDINGOcorre quando modificamos o comportamento de um
método da classe pai na filha adicionando uma nova funcionalidade.
Temos um exemplo de sobrescrita na classe Medico quando
está sobrescreve a implementação de getSalario() herdada da superclasse Funcionário.
Nela, o salario é aumentado em 10%.
Vale ressaltar que na classe Engenheiro não ocorre esse
procedimento.
Se for necessário chamar um método da classe mãe
podemos usar o parent.
A linha comentada em getSalario() realizada o mesmo
trabalho que a linha está acima porem chamando o getSalario() da superclasse.
Como temos apenas um único método com varias
implementações diferentes temos aqui presente o mecanismo chamado polimorfismo.
S
OBRESCRITA OUO
VERRIDING <?php include_once "classes/Medico.class.php"; include_once "classes/Engenheiro.class.php"; $m = new Medico(); $m->setNome("Henrique"); $m->setSalario(1000); echo $m->getNome(); echo $m->getSalario(); echo "<br>"; $e = new Engenheiro(); $e->setNome("Leonardo"); $e->setSalario(1000); echo $e->getNome(); echo $e->getSalario(); ?> Saída: Henrique 1100 Leonardo 1000C
LASSESA
BSTRATASSão classes estruturais, ou seja, que estão na hierarquia de classes para servirem de base para outras classes.
São classes que nunca serão instanciadas na forma de objetos.
Somente suas classes filhas permitiram a criação de objetos.
Para isso, devemos marcar essas classes como classes abstratas para impedir que sejam criados objetos a partir delas.
Se marcarmos a classe funcionário como abstract, ou seja, abstract class Funcionario, somente poderemos criar objetos a partir de Medico e Engenheiro.
M
ÉTODOSA
BSTRATOSConsiste na definição de uma assinatura na classe abstrata.
Este método deverá conter uma implementação na classe filha, mas não deve possuir uma implementação na classe em que ele é definido. Métodos abstratos só existem em classes
abstratas.
C
LASSESF
INAISUma classe marcado como final não pode ser uma superclasse, ou seja, não pode ser base em uma estrutura de herança.
Para criar uma classe folha basta inserir a palavra final na declaração da classe.
M
ÉTODOSF
INAISUm método final não pode ser sobrescrito, ou seja, não pode ser redefinido na classe-filha. Para marcar um método como final, basta utilizar
o operador final no inicio da sua declaração.
C
ONSTANTESPara criar uma constante usamos o operador conste seu acesso de forma externa ao contexto da classe é feito pela sintaxe:
NomeDaClasse::NomeDaConstante. Dentro da classe é feito pela sintaxe
self::NomeDaConstante.
M
ÉTODOSE
STÁTICOSPodem ser invocados diretamente da classe, sem a necessidade de instanciar um objeto para isso. Ele não devem referenciar propriedades internas
pelo operador $this, porque este operador é utilizado para referenciar instancias da classe, mas não a própria classe.
Podem chamar apenas outros métodos estáticos da classe ou utilizar apenas propriedades
estáticas e constantes de classe.
Para executar um método estático, basta utilizar a sintaxe NomeDaClasse:NomeDoMétodo().
C
LASSEC
ALCULADORA<?php
class Calculadora{
constpi = 3.14; // constante staticfunction soma($a, $b){
return $a + $b; }
staticfunction subtracao($a, $b){ return $a - $b; }
staticfunction multiplicacao($a, $b){ return $a * $b; }
staticfunction divisao($a, $b){ return $a / $b; }
staticfunction areaCirculo($raio){
return 2 * self::pi * $raio * $raio; } } ?>
E
XEMPLO <?php include_once "classes/Calculadora.class.php"; echo Calculadora::pi; echo Calculadora::soma(4,2); echo Calculadora::subtracao(4,2); echo Calculadora::multiplicacao(4,2); echo Calculadora::divisao(4,2); echo Calculadora::areaCirculo(1); ?>P
ROPRIEDADESE
STÁTICASSão atributos de uma classe sendo dinâmicas como as propriedades de um objeto, mas estão relacionados a classe.
Como a classe é a estrutura comum a todos os objetos dela derivados, propriedades estáticas são compartilhadas entre todos os objetos de uma classe.
Para fazer referencia à propriedade estática dentro da classe também usamos o self.
C
LASSEP
RODUTO <?php class Produto{ static $quantidade; function __construct(){ self::$quantidade = self::$quantidade + 1; } } ?>E
XEMPLO <?php include_once "classes/Produto.class.php"; $a = new Produto; $b = new Produto; $c = new Produto; echo Produto::$quantidade; ?> Saída é: 3Foram criados 3 objetos da classe Produto. O construtor da classe incrementa em 1 a variável
$quantidade a cada objeto instanciado.
M
ÉTODO__
TOS
TRING()
Um objeto não foi feito para ser impresso diretamente.
Quando imprimimos a referencia de um objeto com echo ou print, o PHP exibe o identificador do objeto.
Cada objeto possui seu identificador próprio. Para alterar esse comportamento, definindo um
método __toString() para cada classe.
Caso o método __toString() exista, no momento em que mandarmos exibir um objeto no console, o PHP irá imprimir o retorno dessa função.
C
LASSEP
RODUTO <?php class Produto{ static $quantidade; function __construct(){ self::$quantidade = self::$quantidade + 1; } function __toString(){ $numero = self::$quantidade; return "Eu sou o objeto $numero"; }} ?>