• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

PHP 5.3 - Classes e Objetos

on

  • 12,200 views

Orientação a Objetos em PHP.

Orientação a Objetos em PHP.

Statistics

Views

Total Views
12,200
Views on SlideShare
11,624
Embed Views
576

Actions

Likes
8
Downloads
386
Comments
0

2 Embeds 576

http://www.georgemendonca.com.br 561
http://gilmarjesus.com 15

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    PHP 5.3 - Classes e Objetos PHP 5.3 - Classes e Objetos Presentation Transcript

    • Orientação a ObjetosBacharel em Ciência da Computação (UFG)Especializando em Engenharia de Software Líder de Projetos – SIGMA / MDIC Professor Formador EAD – NEAD/ETEB george@georgemendonca.com.br http://www.georgemendonca.com.br
    • Orientação a Objetos• Introdução – No PHP 5 há um novo Modelo de Objeto. – O tratamento de objetos do PHP foi completamente reescrito, permitindo uma performance melhor e mais vantagens.30/11/2010 2
    • Orientação a Objetos• Introdução – PHP4 • Classes simples Class Php4 { var $a; var $b; var $c; function Php4($d, $e, $f) { // construtor // comportamentos } } $obj = new Php4(testando, ok, alo );30/11/2010 3
    • Orientação a Objetos• Introdução – PHP5 • Classes mais completas • Uso de padrões Class Php5 { private $a; private $b; private $c; public function __construct($d, $e, $f) {// construtor // comportamentos } } $obj = new Php5(testando, ok, alo );30/11/2010 4
    • Orientação a Objetos• Escrevendo uma classe – Toda definição de classe começa com a palavra-chave class, seguido por um nome da classe, que pode ser qualquer nome que não seja uma palavra reservada no PHP. Seguido por um par de chaves, que contém a definição dos atributos (ou propriedades) e métodos da classe. Class Nome_da_Classe { encapsulamento $atributo; ... encapsulamento function nome_etodo([argumentos]) { /* implementação do comportamento */ [return] } ...30/11/2010 5 }
    • Orientação a Objetos• Escrevendo uma classe – Uma pseudo variável $this está disponível quando um método da classe é chamado dentro de um contexto de objeto. Sua implementação normalmente se encontra dentro do escopo de um método. $this é uma referência para o objeto que chama o método. Class Classe { encapsulamento $atributo; ... encapsulamento function nome_metodo() { return $this->atributo; } ...30/11/2010 } 6
    • Orientação a Objetos• Construtores e Destrutores – PHP 5 permite que os desenvolvedores declarem métodos construtores para as classes. – Classes que tem um método construtor chamam esse método cada vez que um objeto novo é criado, sendo apropriado para qualquer inicialização que o objeto possa vir a precisar no momento em que é instanciado. Nota: Construtores pais não são chamados implicitamente se a classe filha define um construtor. Para executar o construtor da classe pai, uma chamada a parent::__construct() dentro do construtor da classe filha é necessária.30/11/2010 7
    • Orientação a Objetos• Construtores e Destrutores Class ConstrutorDestrutor { Diagrama de Classe private $a = 0; private $b = 0; public function __construct($a, $b) { // comportamentos } public function __destruct() { $this->a = 0; $this->b = 0; } }30/11/2010 8
    • Orientação a Objetos• Encapsulamento – A encapsulamento de um atributo ou método pode ser definida prefixando a declaração com as palavras-chave: • public • protected • private – Public podem ser acessados por todo script. – Protected limita o acesso a classes herdadas e para classe que define o objeto. – Private limita a visibilidade para apenas a classe que define o objeto.30/11/2010 9
    • Orientação a Objetos • Encapsulamento Diagrama de ClasseClass Encapsulamento { // visivel em todo o script public $atributoPublico; // visivel nas classes e subclasses protected $atributoProtegido; // visivel apenas na classe private $atributoPrivado; public function metodoPublico([$argumentos,...]) { // visivel em todos os scripts } protected function metodoProtegido([$argumentos,...]) { // visivel em classes e subclasses } private function metodoPrivado([$argumentos,...]) { // visivel apenas na classe }} 30/11/2010 10
    • Orientação a Objetos• Instanciando um objeto da classe – Para criar uma instância de um objeto da classe, um novo objeto deve ser criado e atribuído à uma variável. – Para tanto é necessário a chamada da palavra reservada new seguido do nome da classe para criar um novo objeto, instanciando então a classe (ou um objeto da classe).30/11/2010 11
    • Orientação a Objetos• Instanciando um objeto da classe require_once ./class/php4.php; require_once ./class/php5.php; require_once ./class/ConstrutorDestrutor.php; require_once ./class/Encapsulamento.php; $php4 = new Php4(d, e, f); $php5 = new Php5(d, e, f); $construtor = new ConstrutorDestrutor(1, 2); $encapsulamento = new Encapsulamento(); echo "<pre>"; print_r($php4); print_r($php5); print_r($construtor); print_r($encapsulamento);30/11/2010 12
    • Orientação a Objetos• Instanciando um objeto da classe Saída: Php4 Object ( [a] => [b] => [c] => ) Php5 Object ( [a:Php5:private] => [b:Php5:private] => [c:Php5:private] => ) ConstrutorDestrutor Object ( [a:ConstrutorDestrutor:private] => 0 [b:ConstrutorDestrutor:private] => 0 ) Encapsulamento Object ( [atributoPublico] => [atributoProtegido:protected] =>30/11/2010 [atributoPrivado:Encapsulamento:private] => 13 )
    • Orientação a Objetos• Exercício – Vamos criar uma classe Funcionario e manipulá-la. – Descrição:30/11/2010 14
    • Orientação a Objetos• Herança – Uma classe pode herdar métodos e propriedades de outra classe usando a palavra-chave extends na sua declaração, implementando o conceito de generalização. – Não é possível herdar classes múltiplas, uma classe só pode herdar uma classe base (ou classe pai, ou ainda classe genérica). – A palavra reservada parent seguida de dois pontos duplos (::) é utilizada para acessar atributos e métodos da classe pai.30/11/2010 15
    • Orientação a Objetos• Herança – A classe Dependentes estende a classe Funcionários, aplicando o conceito de generalização (herança). – Veja o diagrama de classe ao lado: – Classe Dependentes herda Funcionario:30/11/2010 16
    • Orientação a Objetos• Herança – Exercício: Implementar os diagramas de classe do slide anterior. class Dependentes extends Funcionario { // Dependentes.php private $dependentes = array(); public function __construct($dependentes) { $this->dependentes = $dependentes; } public function imprimeDadosFuncionario() { echo Matrícula: .$this->getMatricula().<br /><br />; echo Nome: .$this->getNome().<br /><br />; echo RG: .$this->getRg().<br /><br />; echo Departamento: .$this->getDepartamento().<br /><br />; echo Dependentes: <br />; foreach ($this->dependentes as $value) { echo - .$value.<br />; } } }30/11/2010 17
    • Orientação a Objetos• Herança – Exercício: … continuação da solução do exercício.// appFuncDependentes.php Saída:require_once ./class/Funcionario.php;require_once ./class/Dependentes.php; Ficha do funcionário: Matrícula: 777$dependentes = array(Maria, Pedro, Lucas); Nome: George$funcionario = new Dependentes($dependentes); RG: 1234567$funcionario->setMatricula(777); Departamento: Informática$funcionario->setNome(George);$funcionario->setRg(1234567); Dependentes:$funcionario->setDepartamento(Informática); - Maria - Pedroecho Ficha do funcionário: ; - Lucas$funcionario->imprimeDadosFuncionario();30/11/2010 18
    • Orientação a Objetos• Conversão da classe para string – Impressão da classe: // appToString.php $funcionario = new Funcionario(); echo $funcionario; – Erro: Saída: Catchable fatal error: Object of class Funcionario could not be converted to string in C:... – Correção deste problema convertento para string: // Classe Funcionario.php public function __toString(){ return Classe Funcionario; } – Resultado: Saída:30/11/2010 19 Classe Funcionario
    • Orientação a Objetos• Referência do objeto – Sempre que uma variável do tipo objeto é atribuida a uma outra variável, ele recebe somente a referência deste objeto. – Tais variáveis referenciam exatamente o mesmo objeto.// appReferenciaObjeto.php$funcionario = new Funcionario();$novoFuncionario = $funcionario;$funcionario->setDepartamento(RH);echo "A matrícula do funcionário é: {$novoFuncionario->getDepartamento()}"; Saída: A matrícula do funcionário é: RH30/11/2010 20
    • Orientação a Objetos• Clonagem de Objetos – Necessário quando precisamos clonar um objeto, criando outro espaço em memória ao invés de uma referência. – Neste caso é criada uma nova instância do objeto, contendo as mesmas propriedades e métodos.// appClonagemObjeto.php$funcionario = new Funcionario();$novoFuncionario = clone $funcionario;$funcionario->setDepartamento(RH);echo "A matrícula do funcionário é: {$funcionario->getDepartamento()} <br />";echo "A matrícula do funcionário é: {$novoFuncionario->getDepartamento()}"; Saída: A matrícula do funcionário é: RH30/11/2010 A matrícula do funcionário é: 21
    • Orientação a Objetos• Atributos e Métodos Estáticos – Declarar atributos ou métodos de uma classe como estáticos faz deles acessíveis sem precisar de instanciar a classe. – A palavra reservada STATIC é utilizada na declaração de atributos e métodos estáticos.30/11/2010 22
    • Orientação a Objetos• Atributos e Métodos Estáticos – A referência aos atributos estáticos da classe é feita através da palavra reservada self seguida de dois pontos duplos (::) em vez de “$this->”. – Um atributo declarado como estático não pode ser acessado com um objeto instanciado da classe (embora métodos estáticos podem).30/11/2010 23
    • Orientação a Objetos• Atributos e Métodos Estáticos// Classe Matematicaclass Matematica { public static function soma( $a, $b ) { return $a + $b; }}// appMatematica.php$num1 = 4;$num2 = 5; Saída:echo Matematica::soma($num1, $num2);echo <br />; 9echo Matematica::subtracao($num1, $num2); -1echo <br />; 20echo Matematica::multiplicacao($num1, $num2); 0.8echo <br />;echo Matematica::divisao($num1, $num2);30/11/2010 24
    • Orientação a Objetos• Exercícios – Primeira etapa do exercício: • Transformar os métodos da classe Site em estáticos e testá-los. Esta alteração na implementação será padrão para nossos projetos.30/11/2010 25
    • Orientação a Objetos• Exercícios – Agora vamos criar uma classe utilitária chamada Util: (1) 3 métodos: printVar(), printR() e printDump() para depurarmos (com as funções print_r() e var_dump()) os dados em variáveis, arrays, objetos, etc. (2) 1 Método httpRequest: para abstrair o acesso de variáveis de requisição HTTP através dos métodos de envio de dados GET ou POST. (3) 2 métodos setSession() e getSession() para recuperarmos e inserirmos dados de sessão.30/11/2010 26
    • Orientação a Objetos• Overloading (Sobrecarga) – Provê meios dinâmicos para manipular atributos (propriedades) e métodos em PHP. – Utilizados na manipulação de métodos e propriedades não declarados explicitamente ou não visíveis no escopo atual. – Todos os métodos sobrecarregados devem ser definidos como públicos. – Este procedimento é feito através dos métodos mágicos.30/11/2010 27
    • Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarga de atributos: • __set () : executado para a atribuição de valores em propriedades inacessíveis. • __get () : utilizada para retornar valores de propriedades inacessíveis. • __isset () : acionado para chamar isset () ou empty () em propriedades inacessíveis (PHP 5.1.0). • __unset () : invocado para chamar unset () é em propriedades inacessíveis (PHP 5.1.0).30/11/2010 28
    • Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarga de métodos: • __call () : acionado ao invocar métodos inacessíveis em um contexto de objeto. • __callStatic() : acionado ao invocar métodos estáticos inacessíveis em um contexto de objeto (PHP 5.3.0).30/11/2010 29
    • Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando os atributos da classe Funcionario dos exemplos anteriores: // FuncionarioOverloading.php class FuncionarioOverloading { private $matricula = null; private $nome = null; private $rg = null; protected $departamento = null; public function __construct( ) { } public function __get( $atributo ) { return $this->$atributo; } public function __set( $atributo, $valor) { $this->$atributo = $valor; }30/11/2010 } 30
    • Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando os atributos da classe Funcionario dos exemplos anteriores: // appFuncOver.php $funcionario = new FuncionarioOverloading(); echo "<pre>"; print_r($funcionario); $funcionario->__set(matricula,777); $funcionario->__set(nome,George Mendonça); $funcionario->__set(rg,1234567); $funcionario->__set(departamento,Informática); echo "<pre>"; print_r($funcionario); echo "<br/><strong>Dados do funcionário</strong><br /> - Matrícula: {$funcionario->__get(matricula)} - Nome: {$funcionario->__get(nome)} - RG: {$funcionario->__get(rg)}30/11/2010 - Departamento: {$funcionario->__get(departamento)}"; 31
    • Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando os atributos da classe Funcionario dos exemplos anteriores: Saída: FuncionarioOverloading Object ( [matricula:FuncionarioOverloading:private] => [nome:FuncionarioOverloading:private] => [rg:FuncionarioOverloading:private] => [departamento:protected] => ) FuncionarioOverloading Object ( [matricula:FuncionarioOverloading:private] => 777 [nome:FuncionarioOverloading:private] => George Mendonça [rg:FuncionarioOverloading:private] => 1234567 [departamento:protected] => Informática ) Dados do funcionário - Matrícula: 777 - Nome: George Mendonça30/11/2010 - RG: 1234567 32 - Departamento: Informática
    • Orientação a Objetos• Iteração de Objetos – PHP 5 fornece uma maneira de definir objetos para que seja possível iterar atributos públicos de uma classe, como uma lista de itens. – Por padrão, todas as propriedades visíveis (públicas) serão usadas para a iteração. – Essa iteração é efetualda facilmente com a estrutura de controle foreach.30/11/2010 33
    • Orientação a Objetos• Iteração de Objetos Class Iteracao { public $nome = "George"; public $casado = true; public $idade = 28; } Saída: // appIteracaoObjetos.php $objeto = new Iteracao(); nome : George casado : 1 foreach ($objeto as $atributo => $valor) { idade : 28 print "$atributo : $valor <br />"; } Objeto da classe Atributo da classe Valor do atributo30/11/2010 34
    • Orientação a Objetos• Indução de Tipo – PHP 5 implementa indução de tipo. – Neste conceito, funções e métodos podem forçar que parâmetros devem ser um objeto de uma classe. – Basta especificar o nome da classe no desenvolvimento da função ou método. – É possível também aplicar em arrays (PHP 5.1).30/11/2010 35
    • Orientação a Objetos• Indução de Tipo Class Aves { // Classe Aves.php public $galinha = "có có có!"; public $pato = "quá quá quá!"; } Class AssarAves {// Classe AssarAves.php public $assados = "Hummmm!"; function cardapio( Aves $cardapio) { echo "Galinha: $cardapio->galinha<br /> Pato: $cardapio->pato<br /> Assados: $this->assados"; Saída: } } Galinha: có có có! Pato: quá quá quá! $aves = new Aves(); // appAves.php Assados: Hummmm! $assarAves = new AssarAves();30/11/2010 $assarAves->cardapio($aves); 36
    • Orientação a Objetos• Reflection API – Permite realizar a engenharia reversa de diversos elementos em PHP5. – É uma poderosa funcionalidade que nos permite obter informações e metadados de classes, objetos, funções, etc.30/11/2010 37
    • Orientação a Objetos• Reflection API // appReflexao.php $refClasslIter = new ReflectionClass(IteracaoObjetos); $refClasslFunc = new ReflectionClass(Funcionario); echo <strong>Propriedades da classe IteracaoObjetos:</strong> <br />; foreach ($refClasslIter->getProperties() as $value) { echo $value.<br />; } echo <br /><strong>Dados da classe Funcionario:</strong> <br />; echo "Nome da classe: {$refClasslFunc->getName()} <br />"; echo "Arquivo: {$refClasslFunc->getFileName()} <br />"; Saída: Propriedades da classe IteracaoObjetos: Property [ public $nome ] Property [ public $casado ] Property [ public $idade ] Dados da classe Funcionario: Nome da classe: Funcionario30/11/2010 38 Arquivo: C:Program FilesZendApache2htdocsphp5.3-objetosclassFuncionario.php
    • Orientação a Objetos• Late Static Bindings (PHP 5.3) – Permite referenciar uma classe chamada no contexto de herança estática. – Para tanto a palavra reservada static:: é utilizada na chamada de um método estático, mas não somente para métodos.30/11/2010 39
    • Orientação a Objetos• Late Static Bindings (PHP 5.3) – Limitação do self:: • Em um contexto de herança, por exemplo, referências estáticas são resolvidas usando a classe na qual foi definida, ou seja, a qual pertence. Mas não na classe a qual foi chamada em tempo de execução. – Late Static Bingings • Resolve tal limitação através da palavra reservada static:: em vez de self::, referenciando a classe chamada em tempo de execução em vez30/11/2010 40 da classe que a define.
    • Orientação a Objetos• Late Static Bindings (PHP 5.3) – Exemplo • Vamos implememtar o exemplo seguinte criando as classes em um mesmo arquivo para facilitar: – LateStaticBindings.php (classe) • E para testar vamos implementar o arquivo: – appLateStaticBindings.php • Vejamos a implementação a seguir:30/11/2010 41
    • Orientação a Objetos• Late Static Bindings (PHP 5.3)30/11/2010 42
    • Orientação a Objetos• Late Static Bindings (PHP 5.3) class X // LateStaticBindings.php // appLateStaticBindings.php { TesteX::chamaClasse(); public static function imprimeClasse() { echo Eu sou a classe .__CLASS__; } public static function chamaClasse() { self::imprimeClasse(); } } class TesteX extends X { public static function imprimeClasse() { echo Eu sou a classe .__CLASS__; Saída: } } Eu sou a classe X30/11/2010 43
    • Orientação a Objetos• Late Static Bindings (PHP 5.3)30/11/2010 44
    • Orientação a Objetos• Late Static Bindings (PHP 5.3) class Y // LateStaticBindings.php // appLateStaticBindings.php { TesteX::chamaClasse(); public static function imprimeClasse() echo <br />; { TesteY::chamaClasse(); echo Eu sou a classe .__CLASS__; } public static function chamaClasse() { Saída: static::imprimeClasse(); } Eu sou a classe X } Eu sou a classe TesteY class TesteY extends Y { public static function imprimeClasse() { echo Eu sou a classe .__CLASS__; } }30/11/2010 45
    • Orientação a Objetos• Autoload – Carregando classes automaticamente – Normalmente ao desenvolver aplicações orientadas a objeto em PHP os desenvolvedores criam um arquivo para cada definição de classe. – Consequentemente uma lista de includes é necessária para a inclusão de cada classe em uso. No o PHP5 isso não é mais necessário.30/11/2010 46
    • Orientação a Objetos• Autoload – Carregando classes automaticamente – Com a função __autoload quando você tentar usar uma classe/interface que ainda não foi definida, o script engine tem uma última chance para carregar a classe antes que o PHP aponte o erro. – Esta função é chamada automaticamente.30/11/2010 47
    • Orientação a Objetos• Autoload – Carregando classes automaticamente – Implementação básica: function __autoload( $classe ) { require_once "{$classe}.php"; } – Exemplo testando as classes Funcionario, Matematica e Util já implementadas: require_once ./func/autoload.php; // appAutoloadClasses.php $funcionario = new Funcionario; echo $funcionario; echo <br />; echo Matematica::multiplicacao(4, 4); echo <br />; Util::printR($funcionario, __FILE__, __LINE__);30/11/2010 48
    • Orientação a Objetos• Autoload – Carregando classes automaticamente Saída: Classe Funcionario 16 ========================================================== Arquivo: C:Program FilesZendApache2htdocsphp5.3-objetosappAutoloadClasses.php Linha: 17 ========================================================== Funcionario Object ( [matricula:Funcionario:private] => [nome:Funcionario:private] => [rg:Funcionario:private] => [departamento:protected] => )30/11/2010 49
    • Orientação a Objetos• Autoload – Carregando classes automaticamente – Avaliação prática: • E se as classes estiverem separadas em diretórios diferentes? Como por exemplo nas seguintes pastas: model/… view/… controller/… Como resolver este problema? Pesquise, implemente e entregue na próxima aula.30/11/2010 50
    • Orientação a Objetos• Constantes do Objeto – É possível definir valores constantes em cada classe, permanecendo os mesmos e imutáveis. – Constantes diferem de variáveis no não uso do símbolo $ para declará-las ou utilizá-las. Mas utilizando a palavra reservada CONST na declaração. – Assim como os atributos estáticos são referenciadas ou chamadas através da palavra reservada self do PHP.30/11/2010 51
    • Orientação a Objetos• Constantes do Objeto – Como os atributos estáticos (static), valores constantes não podem ser acessados a partir de uma instância de um objeto (como por exemplo $object::constante). – O valor deve ser uma expressão constante, não podendo ser (por exemplo) uma variável, um atributo de uma classe, o resultado de uma operação matemática ou uma chamada de função.30/11/2010 52
    • Orientação a Objetos• Constantes do Objeto – Classe de constantes: // Classe CadastroEmpresas.php class CadastroEmpresas { const TITULO_TELA = "Cadastro de Empresas"; const NOME = "Nome:"; const CNPJ = "CNPJ:"; const RAZAO_SOCIAL = "Razão Social:"; const BOTAO_SUBMIT = " >> Salvar "; }30/11/2010 53
    • Orientação a Objetos• Constantes do Objeto – Implementação básica:// appConstantesdaClasse.phpecho"<p><strong>".CadastroEmpresas::titulo_tela."</strong></p><form>".CadastroEmpresas::nome." <input type=text value= /><br />".CadastroEmpresas::cnpj." <input type=text value= /><br />".CadastroEmpresas::razao_social." <input type=text value= /><br /><br /><input type=submit value=".CadastroEmpresas::botao_submit." /></form>"; Saída:30/11/2010 54
    • Orientação a Objetos• Classes e Métodos Abstratos – PHP 5 introduz métodos e classes abstratos. – Não é permitido criar uma instância de uma classe que foi definida como abstrata. – Qualquer classe que contêm pelo menos um método abstrato deve também ser abstrata. – Métodos definidos como abstratos simplesmente declaram a assinatura do método, eles não podem definir a implementação.30/11/2010 55
    • Orientação a Objetos• Classes e Métodos Abstratos – Quando uma classe herda uma classe abstrata, todos os métodos marcados como abstratos na declaração da classe pai devem ser definidos na classe filha. – Além disso, esses métodos devem ser definidos com a mesma visibilidade ou mais fraca. – Por exemplo, se um método abstrado é definido como protected, a implementação do método deve ser definida como protected ou public.30/11/2010 56
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 - Classe Abstrata Venda // Classe Abstrata Venda.php abstract class Venda { private $valor = 0.0; private $desconto = 0.0; public function __set($atributo, $valor) { $this->$atributo = $valor; } public function __get($atributo) { return $this->$atributo; } }30/11/2010 57
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 - Classe Orcamento (herda a classe Venda) // Classe Orcamento.php class Orcamento extends Venda { private $taxa = array(cheque => 1.10, cartao => 1.18 ); public function vendaVista() { return $this->__get(valor) - $this->desconto; } public function vendaCheque() { return ($this->__get(valor)*$this->taxa[cheque]) - $this->desconto; } public function vendaCartao() { return $this->__get(valor)*$this->taxa[cartao] - $this->desconto; }30/11/2010 } 58
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 – Testando as classes de Venda // appVenda.php $venda = new Orcamento(); Saída: $venda->__set(valor, 90); $venda->__set(desconto, 10); === Orçamento === echo "<strong> === Orcamento === </strong><br /><br />"; echo "Preco: {$venda->__get(valor)}<br />"; Preço: 90 echo "Desconto: {$venda->__get(desconto)}<br />"; Desconto: 10 echo "A vista: {$venda->vendaVista()}<br />"; À vista: 80 echo "Cheque: {$venda->vendaCheque()}<br />"; Cheque: 89 echo "Cartao: {$venda->vendaCartao()}<br />"; Cartão: 96.230/11/2010 59
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Adição do método abstrato imprimeOrcamento // Classe Abstrata Venda.php abstract class Venda { private $valor = 0.0; private $desconto = 0.0; public function __set($atributo, $valor) { $this->$atributo = $valor; } public function __get($atributo) { return $this->$atributo; } abstract function imprimeOrcamento($valor, $desconto);30/11/2010 } 60
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Adição do método abstrato imprimeOrcamento // Classe Orcamento.php class Orcamento extends Venda { ... public function imprimeOrcamento($valor, $desconto) { $this->__set(valor, $valor); $this->__set(desconto, $desconto); echo "<strong> === Orcamento === </strong><br /><br />"; echo "Preco: {$this->__get(valor)}<br />"; echo "Desconto: {$this->__get(desconto)}<br />"; echo "A vista: {$this->vendaVista()}<br />"; echo "Cheque: {$this->vendaCheque()}<br />"; echo "Cartao: {$this->vendaCartao()}<br /><br />"; } ... }30/11/2010 61
    • Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Adição do método abstrato imprimeOrcamento // appVenda.php $a = Util::httpRequest(a); $b = Util::httpRequest(b); if(!empty($a) and !empty($b)) { $venda = new Orcamento(); Saída: $venda->imprimeOrcamento($a, $b); echo "<button onclick="window.location=appVenda.php"> >> Refazer Orçamento </button>"; } else { ?> <form method="post"> Valor <input type="text" name="a" /> <br /> Desconto <input type="text" name="b"> <br /> <input type="submit" value=" >> Gerar Orçamento " /> </form> <?php30/11/2010 } 62
    • Orientação a Objetos• Interfaces – Interfaces de Objetos permitem a criação de código que especifica quais métodos e variáveis uma classe deve implementar, sem ter que definir como esses métodos serão tratados. – A Interface é um contrato da classe. Interfaces são definidas usando a palavra-chave interface, da mesma maneira que uma classe comum, mas sem nenhum dos métodos ter seu conteúdo definido.30/11/2010 63
    • Orientação a Objetos• Interfaces – Todos os métodos declarados em uma interface devem ser public, essa é a natureza de uma interface. Para implementar uma interface, o operador implements é usado. – Todos os métodos na interface devem ser implementados na classe; não fazer isso resultará em um erro fatal. – Classes podem implementar mais de uma interface se assim for desejado, separando cada interface com uma vírgula. Nota: Uma classe não pode implementar duas interfaces que compartilham30/11/2010 o mesmo nome uma vez que isso causaria ambiguidade. 64
    • Orientação a Objetos• Interfaces – Exemplo 01 - Interface OperacoesMatematicas // Interface IOperacoesMatematicas.php interface IOperacoesMatematicas { public static function soma($x, $y); public static function subtracao($x, $y); public static function multiplicacao($x, $y); public static function divisao($x, $y); public static function imprimeOperacoes($x, $y); }30/11/2010 65
    • Orientação a Objetos• Interfaces – Exemplo 01 – Classe OpMatematicas que implementa a interface OperacoesMatematicas // Classe OpsMatematicas.php class OpMatematicas implements IOperacoesMatematicas { public static function soma($x, $y){ return $x + $y; } public static function subtracao($x, $y) { return $x - $y; } public static function multiplicacao($x, $y) { return $x * $y; } public static function divisao($x, $y) { return ($y <> 0) ? $x / $y : Divsao por zero!; } public static function imprimeOperacoes($a, $b) { echo "<b>As operacoes matematicas entre $a e $b sao</b>: <br />"; echo "Soma: ".OpMatematicas::soma($a, $b)."<br />"; echo "Subtracao: ".OpMatematicas::subtracao($a, $b)."<br />"; echo "Multiplicacao: ".OpMatematicas::multiplicacao($a, $b)."<br />"; echo "Divisao: ".OpMatematicas::divisao($a, $b)."<br />"; }30/11/2010 } 66
    • Orientação a Objetos • Interfaces – Exemplo 01 – Aplicação appOpMatematicas// appOpMatematicas.php$a = Util::httpRequest(a);$b = Util::httpRequest(b);if(!empty($a) and !empty($b)){ Saída: OpMatematicas::imprimeOperacoes($a, $b);} As operacoes matemáticas entre 7 e 9 são:else Soma: 16{ Subtracao: -2 ?> Multiplicacao: 63 <form method="post"> Divisao: 0.77777777777778 1º Número: <input type="text" name="a" /> <br /> 2º Número: <input type="text" name="b" /> <br /> <input type="submit" value=" >> Calcular " /> </form> <?php} 30/11/2010 67
    • Orientação a Objetos• Polimorfismo – É a capacidade de dois ou mais objetos de diferentes classes responderem à mesma mensagem de diferentes maneiras. Ou seja, é um recurso que possibilita que objetos diferentes sejam tratados por uma interface única. – O Polimorfismo se define então na implementação de diversos comportamentos em diferentes classes, que se relacionam através de uma única Interface ou Superclasse.30/11/2010 68
    • Orientação a Objetos• Polimorfismo interface IAnuncioImobiliaria // IAnuncioImobiliaria.php { public static function imprimeDados(); } class Anuncio1 implements IAnuncioImobiliaria { // Anuncio1.php private static $dados = Casa, 2 quartos, sala, cozinha, R. 37, Qd. 32, JD Oriente, Cuiabá-MT;; public static function imprimeDados() {echo self::$dados; } } class Anuncio2 implements IAnuncioImobiliaria {// Anuncio2.php public static $dados = AP, 3 quartos, sala, cozinha, 2 garagens, R. Barão Franca, Qd. 02, Rodovalho, Goiânia-GO;; public static function imprimeDados() {echo self::$dados; } } class Anuncio3 implements IAnuncioImobiliaria { // Anuncio3.php public static $dados = Sobrado, 5 quartos, 2 salas, 2 cozinhas, 3 garagens, SEPN, Qd. 205, Brasília-DF; public static function imprimeDados() {echo self::$dados; } }30/11/2010 69
    • Orientação a Objetos• Polimorfismo // appAnuncios.php echo <b>Anúncio imobiliário</b>: <br /><br />; Anuncio1::imprimeDados(); echo <br />; Anuncio2::imprimeDados(); echo <br />; Anuncio3::imprimeDados(); Saída: Anúncio imobiliário: Casa, 2 quartos, sala, cozinha, R. 37, Qd. 32, JD Oriente, Cuiabá-MT; AP, 3 quartos, sala, cozinha, 2 garagens, R. Barão Franca, Qd. 02, Rodovalho, Goiânia-GO; Sobrado, 5 quartos, 2 salas, 2 cozinhas, 3 garagens, SEPN, Qd. 205, Brasília-DF30/11/2010 70
    • Orientação a Objetos• Exceções – PHP 5 tem um modelo de exceção é similar ao de outras linguagens de programação. Uma exceção pode ser disparada (thrown), ou pega (caught ou "catched") no PHP. – Podemos implementar um código PHP em um bloco try, para facilitar a captura de exceções em potencial. – Cada bloco try, deve ter pelo menos um bloco catch correspondente.30/11/2010 71
    • Orientação a Objetos• Exceções – Vários blocos catch podem ser usados para pegar diferentes classes de exceções. – A execução normal (quando nenhuma exceção é disparada dentro de um bloco try ou quando um catch compatível com a classe da exceção disparada não estiver presente) continuará após o último bloco catch definido na sequência. – Exceções podem ser disparadas (ou re-disparadas) dentro de um bloco catch.30/11/2010 72
    • Orientação a Objetos• Exceções – Quando uma exceção é disparada, o código logo após à instrução não será executada, e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada.30/11/2010 73
    • Orientação a Objetos• Exceções – Criando uma classe de Exceção para uma classe // DivisaoException.php class DivisaoException extends Exception {} // Divisao.php class Divisao { public function __construct($a, $b) { if ($b == 0) { throw new DivisaoException(Erro - Divisão por zero!); } } }30/11/2010 74
    • Orientação a Objetos• Exceções – Criando uma aplicação para disparar a Exceção // appException.php try { $divisao = new Divisao(5, 0); } catch (DivisaoException $e) { echo "Mensagem: {$e->getMessage()} <br /> Linha: {$e->getLine()} <br /> Arquivo: {$e->getFile()} <br /> Codigo: {$e->getCode()}"; } Saída: Mensagem: Erro - Divisão por zero! Linha: 8 Arquivo: D:ZendApache2htdocsphp5.3-objetosclassDivisao.php30/11/2010 75 Codigo: 0
    • Orientação a Objetos• Simple XML – O SimpleXML provê um conjunto de ferramentas muito fácil e simples de usar para converter XML em objetos que podem ser processados normalmente com seletores de propriedades e iteradores de arrays. – A extensão SimpleXML requer PHP 5. – A extensão SimpleXML é habilitada por padrão.30/11/2010 76
    • Orientação a Objetos• Simple XML – Criando o arquivo XML // Arquivo biblioteca.xml <?xml version="1.0" encoding="UTF-8"?> <biblioteca> <categoria id="tecnico"> <livro> <titulo>PHP 5 - Programação Poderosa</titulo> <autor>Andi Gutmans, Stig Bakken, Derick Rethans</autor> </livro> <livro> <titulo>Zend Framework in Action</titulo> <autor>Rob Allen</autor> </livro> </categoria> </biblioteca>30/11/2010 77
    • Orientação a Objetos• Simple XML – Criando uma aplicação com a extensão // appSimpleXml.php $biblioteca = simplexml_load_file(./inc/biblioteca.xml); foreach ($biblioteca->categoria as $categoria) { echo "Categoria: " . $categoria[id] . <br>; foreach ($categoria->livro as $livro) { echo "Titulo: " . $livro->titulo . <br>; echo "Autor: " . $livro->autor . <br>; } } Saída: Categoria: Técnico Titulo: PHP 5 - Programação Poderosa Autor: Andi Gutmans, Stig Bakken, Derick Rethans30/11/2010 Titulo: Zend Framework in Action 78 Autor: Rob Allen
    • Orientação a Objetos• Padrões de Projeto – Os padrões de projeto de software ou padrões de desenho de software, também muito conhecido pelo termo original em inglês Design Patterns, descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos.30/11/2010 79
    • Orientação a Objetos• Padrões de Projeto – Objetivos • Reutilização de código • Melhores práticas de programação • Solução para problemas do dia a dia30/11/2010 80
    • Orientação a Objetos• Padrões de Projeto – Singleton • O Design Pattern Singleton é um dos padrões de projetos mais fáceis que existe. Ele que garante a existência de uma única instância de uma determinada classe para um objeto, mantendo um ponto global de acesso ao seu objeto. • Este padrão é utilizado consequentemente em implementações que necessitam de classes que disponibilizam apenas uma instância do objeto na aplicação.30/11/2010 81
    • Orientação a Objetos• Singleton – Criando a classe // Classe Singleton.php class Singleton { // instancia da classe private static $objDaClasse = null; private function __construct() { /* ... */ } public static function getObjDaClasse() { if (self::$objDaClasse === null) { self::$objDaClasse = new Singleton(); } return self::$objDaClasse; } }30/11/2010 82
    • Orientação a Objetos• Singleton – Criando uma aplicação para testar o objeto Singleton// appSingleton.php Apenas um objeto$o1 = Singleton::getObjDaClasse(); daclasse é criado em$o2 = Singleton::getObjDaClasse(); memória$o3 = Singleton::getObjDaClasse();echo <pre>; Saída:var_dump($o1);var_dump($o2); object(Singleton)#1 (0) {var_dump($o3); } object(Singleton)#1 (0) { } object(Singleton)#1 (0) { }30/11/2010 83