Programação para WEB <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>Programaç...
Classes e Objetos <?php class   Pessoa   { private   $nome ; function   __construct( $nome )   { $this ->nome   =   $nome ...
Herança <?php require_once ( 'pessoa.php' ); class   PessoaFisica   extends   Pessoa   { private   $cpf ; function   __con...
Sobrescrita de Métodos <?php class   MinhaClasse   { protected   function   minhaFuncao()   { echo   &quot;MinhaClasse::mi...
Sobrecarga de Construtores <ul><li>Em PHP cada classe somente pode ter um único construtor. </li></ul><ul><li>Assim, não h...
include ou require <ul><li>Ambos incluem e avaliam o arquivo informado. </li></ul><ul><li>A ausência do arquivo especifica...
include_once ou require_once <ul><li>Similar a  include  e  require , mas se o arquivo já tiver sido incluído, a inclusão ...
autoload <ul><li>Pode-se definir uma função  __autoload  que é automaticamente chamada caso seja usada uma classe que aind...
autoload <?php class   MinhaClasse   { function   helloWorld()   { echo   &quot;Hello, World
&quot; ; } } ?> <?php functio...
Classes e Objetos <?php class   A   { private   $nome ; function   __construct( $nome )   { $this ->nome   =   $nome ; } f...
Construtores e Destrutores <ul><li>Construtores pais não são chamados implicitamente pelo construtor da classe filha. </li...
Construtores e Destrutores <?php class   MinhaClasseDestruivel   { function   __construct()   { print   &quot;No construto...
Visibilidade dos membros <?php class   MinhaClasse   { public   $publica   =   'Public' ; protected   $protegida   =   'Pr...
Visibilidade dos membros <?php class   MinhaClasse   { public   function   __construct()   {   } public   function   meuPu...
:: Operador de Resolução de Escopo <ul><li>Permite acesso a membros estáticos, constantes ou sobrescritos de uma classe. <...
:: Operador de Resolução de Escopo <?php class   OutraClasse   extends   MinhaClasse   { public   static   $meu_estatico  ...
Inicializações inválidas <?php class   SimpleClass   { // declarações de membro inválidas public   $var1   =   'olá ' . 'm...
Inicializações válidas <?php class   SimpleClass   { // declarações de membro válidas public   $var6   =   myConstant; pub...
Membros de Classe <?php error_reporting(E_STRICT); class   Foo   { public   static   function   umMetodoEstatico()   { ech...
Constantes <ul><li>Constantes diferem de variáveis normais no não uso do símbolo $ para declará-las ou usá-las. </li></ul>...
Classes Abstratas <?php abstract   class   ClasseAbstrata   { abstract   protected   function   pegarValor(); abstract   p...
Interfaces <?php interface   Animal   { public   function   emiteSom(); } class   Gato   implements   Animal   { public   ...
final <ul><li>Métodos final NÃO podem ser sobrescritos em classes que o herdem.  </li></ul><ul><li>Classes final não podem...
final <ul><li>O exemplo abaixo também não funciona: </li></ul><?php final   class   ClasseBase   { // ... } class   Classe...
O método __toString() <ul><li>Retorna a representação de um objeto em forma de string. </li></ul><?php class   Pessoa   { ...
Clonagem de Objetos <ul><li>Uma cópia de objeto é criada usando o comando 'clone'. Isso chama o método __clone() do objeto...
Clonagem de Objetos <?php class   Fone   { public   $numero ,   $tipo ; public   function   __construct( $numero , $tipo )...
Interceptação <ul><li>Chamada de métodos e acesso a membros podem ser interceptados pelos métodos  __set, __get e __call ....
Interceptação <?php class   Pessoa   { private   $atributos ; function   __set( $nome , $valor )   { $this ->atributos[ $n...
Instanciação Dinâmica <?php class   MinhaClasse   { function   exibe( $a , $b )   { echo   &quot;Parâmetros:  $a   $b <br/...
Tratamento de Erros <ul><li>A forma de manipulação de erro mais simples é abortar a execução da aplicação através da funçã...
Geração e Tratamento de Erros <ul><li>A função  trigger_error()  gera um erro de um tipo determinado. </li></ul><ul><li>Ti...
Geração e Tratamento de Erros <?php function   trata_erros( $tipo_erro , $msg , $arq , $linha )   { echo   $msg   .   '<br...
Exceções <ul><li>Uma exceção pode ser disparada (throw), ou capturada (catch). </li></ul><ul><li>Código rodeado de um bloc...
Exceções <ul><li>Uma exceção é um objeto da classe Exception que contém os seguintes métodos: </li></ul><ul><li>getMessage...
Exceções <?php function   inverso( $x )   { if   ( $x   ==   0 )   { throw   new   Exception( 'Divisão por zero.' ); } els...
Tratador de Exceções <ul><li>A função  set_exception_handler()  define uma função de tratamento de exceção padrão se uma e...
Comparação de Objetos <ul><li>Operador de comparação (==) </li></ul><ul><ul><li>Objetos são iguais se possuírem o mesmo co...
Comparação de Objetos <?php class   Pessoa   { private   $nome ; function   __construct( $nome )   { $this ->nome   =   $n...
Comparação de Tipo <?php class   Pessoa   {  } class   PessoaFisica   extends   Pessoa   {  } $p1   =   new   PessoaFisica...
Upcoming SlideShare
Loading in …5
×

Php 08 Oo

3,515 views

Published on

Published in: Technology
1 Comment
4 Likes
Statistics
Notes
No Downloads
Views
Total views
3,515
On SlideShare
0
From Embeds
0
Number of Embeds
48
Actions
Shares
0
Downloads
253
Comments
1
Likes
4
Embeds 0
No embeds

No notes for slide

Php 08 Oo

  1. 1. Programação para WEB <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>Programação Orientada a Objetos em PHP
  2. 2. Classes e Objetos <?php class Pessoa { private $nome ; function __construct( $nome ) { $this ->nome = $nome ; } function getNome() { return $this ->nome; } function setNome( $nome ) { $this ->nome = $nome ; } } $p = new Pessoa( 'João' ); $q = $p ; $p ->setNome( &quot;Maria&quot; ); echo &quot;{$p->getNome()} < br /> &quot;; echo &quot;{$q->getNome()} < br /> &quot;; ?>
  3. 3. Herança <?php require_once ( 'pessoa.php' ); class PessoaFisica extends Pessoa { private $cpf ; function __construct( $nome , $cpf ) { parent ::__construct( $nome ); $this ->cpf = $cpf ; } function getCpf() { return $this ->cpf; } function setCpf( $cpf ) { $this ->cpf = $cpf ; } } $pf = new PessoaFisica( 'Maria' , '123.456.789-00' ); echo &quot;Nome: { $pf ->getNome()} <br/>&quot; ; echo &quot;CPF: { $pf ->getCpf()} <br/>&quot; ; ?>
  4. 4. Sobrescrita de Métodos <?php class MinhaClasse { protected function minhaFuncao() { echo &quot;MinhaClasse::minhaFuncao() &quot; ; } } class OutraClasse extends MinhaClasse { public function minhaFuncao() { parent ::minhaFuncao(); echo &quot;OutraClasse::minhaFuncao() &quot; ; } } $classe = new OutraClasse(); $classe ->minhaFuncao(); ?>
  5. 5. Sobrecarga de Construtores <ul><li>Em PHP cada classe somente pode ter um único construtor. </li></ul><ul><li>Assim, não há sobrecarga de construtores: </li></ul><?php class Pessoa { private $nome ; function __construct() { } function __construct( $nome ) { $this ->nome = $nome ; } } ?> Fatal error: Cannot redeclare Pessoa::__construct()
  6. 6. include ou require <ul><li>Ambos incluem e avaliam o arquivo informado. </li></ul><ul><li>A ausência do arquivo especificado no require , interrompe o processamento e produz um Fatal Error . </li></ul>
  7. 7. include_once ou require_once <ul><li>Similar a include e require , mas se o arquivo já tiver sido incluído, a inclusão não será feita novamente. </li></ul>
  8. 8. autoload <ul><li>Pode-se definir uma função __autoload que é automaticamente chamada caso seja usada uma classe que ainda não foi definida. </li></ul><ul><li>Isso pode evitar a necessidade de escrever múltiplos includes ou requires. </li></ul><?php function __autoload( $class_name ) { require_once $class_name . '.php' ; } $obj = new MyClass1(); $obj2 = new MyClass2(); ?>
  9. 9. autoload <?php class MinhaClasse { function helloWorld() { echo &quot;Hello, World &quot; ; } } ?> <?php function __autoload( $class_name ) { require_once ( $_SERVER [ &quot;DOCUMENT_ROOT&quot; ] . &quot;/classes/ $class_name .php&quot; ); } ?> <?php require_once &quot;autoload.php&quot; ; $obj = new MinhaClasse(); $obj ->helloWorld(); ?> index.php autoload.php MinhaClasse.php
  10. 10. Classes e Objetos <?php class A { private $nome ; function __construct( $nome ) { $this ->nome = $nome ; } function oi() { if ( isset ( $this )) { echo 'Oi, ' . $this ->nome. '. Este objeto é instância da classe ' ; echo get_class( $this ). '<br/>' ; } else { echo 'Oi, não sei o seu nome, pois o método está sendo ' ; echo 'executado estaticamente.<br/>' ; } } } class B { function ola() { A::oi(); } } $a = new A( &quot;Maria&quot; ); $a ->oi(); A::oi(); $b = new B(); $b ->ola(); B::ola(); ?>
  11. 11. Construtores e Destrutores <ul><li>Construtores pais não são chamados implicitamente pelo construtor da classe filha. </li></ul><ul><li>Para executar o construtor da classe pai, é necessária uma chamada a parent::__construct() no construtor da classe filha. </li></ul><ul><li>O método destrutor ou finalizador será chamado assim que todas as referências a um objeto particular forem removidas ou quando o objeto for explicitamente destruído através da função unset() ou ainda quando o programa é finalizado. </li></ul><ul><li>Destrutores pais não serão chamados implicitamente. Para executar o destrutor pai, deve-se fazer uma chamada explicitamente a parent::__destruct() no corpo do destrutor. </li></ul>
  12. 12. Construtores e Destrutores <?php class MinhaClasseDestruivel { function __construct() { print &quot;No construtor<br/>&quot; ; $this ->name = &quot;MinhaClasseDestruivel&quot; ; } function __destruct() { print &quot;Destruindo $this ->name &quot; ; } } $obj = new MinhaClasseDestruivel(); ?>
  13. 13. Visibilidade dos membros <?php class MinhaClasse { public $publica = 'Public' ; protected $protegida = 'Protected' ; private $privada = 'Private' ; function imprimeAlo() { echo $this ->publica; echo $this ->protegida; echo $this ->privada; } } $obj = new MinhaClasse(); $obj ->imprimeAlo(); echo $obj ->publica; // Funciona echo $obj ->protegida; // Erro Fatal echo $obj ->privada; // Erro Fatal ?>
  14. 14. Visibilidade dos membros <?php class MinhaClasse { public function __construct() { } public function meuPublico() { } protected function meuProtegido() { } private function meuPrivado() { } // Se nada for dito, é public function foo() { $this ->meuPublico(); $this ->meuProtegido(); $this ->meuPrivado(); } } $minhaclasse = new MinhaClasse; $minhaclasse ->foo(); $minhaclasse ->meuPublico(); // Funciona $minhaclasse ->meuProtegido(); // Erro Fatal $minhaclasse ->meuPrivado(); // Erro Fatal ?>
  15. 15. :: Operador de Resolução de Escopo <ul><li>Permite acesso a membros estáticos, constantes ou sobrescritos de uma classe. </li></ul><?php class MinhaClasse { const VALOR_CONST = 'Um valor constante' ; } $classname = 'MinhaClasse' ; echo $classname ::VALOR_CONST; echo MinhaClasse::VALOR_CONST; ?>
  16. 16. :: Operador de Resolução de Escopo <?php class OutraClasse extends MinhaClasse { public static $meu_estatico = 'variável estática' ; public static function doisPontosDuplo() { echo parent ::VALOR_CONST . &quot; &quot; ; echo self :: $meu_estatico . &quot; &quot; ; } } $classname = 'OutraClasse' ; echo $classname ::doisPontosDuplo(); OutraClasse::doisPontosDuplo(); ?> <ul><li>As palavras reservadas self e parent são usadas para acessar membros de dentro da definição da classe. </li></ul>
  17. 17. Inicializações inválidas <?php class SimpleClass { // declarações de membro inválidas public $var1 = 'olá ' . 'mundo' ; public $var2 = <<<FIM olá mundo FIM; public $var3 = 1 + 2 ; public $var4 = self ::myStaticMethod(); public $var5 = $myVar ; } ?> <ul><li>Variáveis , membros de classe ou chamada de função não podem ser usados na inicialização direta de atributos. </li></ul>
  18. 18. Inicializações válidas <?php class SimpleClass { // declarações de membro válidas public $var6 = myConstant; public $var7 = self ::classConstant; public $var8 = array ( true , false ); } ?>
  19. 19. Membros de Classe <?php error_reporting(E_STRICT); class Foo { public static function umMetodoEstatico() { echo 'oi<br/>' ; } public function umMetodoNaoEstatico() { echo 'olá<br/>' ; } } Foo::umMetodoEstatico(); Foo::umMetodoNaoEstatico(); ?> <ul><li>Chamar métodos não estáticos de maneira estática gera um aviso de nível E_STRICT. </li></ul>
  20. 20. Constantes <ul><li>Constantes diferem de variáveis normais no não uso do símbolo $ para declará-las ou usá-las. </li></ul><?php class MinhaClasse { const constante = 'valor constante' ; function mostrarConstante() { echo self ::constante . &quot;<br/>&quot; ; } } echo MinhaClasse::constante . &quot;<br/>&quot; ; $classe = new MinhaClasse(); $classe ->mostrarConstante(); ?>
  21. 21. Classes Abstratas <?php abstract class ClasseAbstrata { abstract protected function pegarValor(); abstract protected function valorComPrefixo( $prefixo ); public function imprimir() { print $this ->pegarValor() . '<br/>' ; } } class ClasseConcreta1 extends ClasseAbstrata { protected function pegarValor() { return &quot;ClasseConcreta1&quot; ; } public function valorComPrefixo( $prefixo ) { return &quot; { $prefixo } ClasseConcreta1&quot; ; } } $classe1 = new ClasseConcreta1; $classe1 ->imprimir(); echo $classe1 ->valorComPrefixo( 'FOO_' ) . '<br/>' ; ?>
  22. 22. Interfaces <?php interface Animal { public function emiteSom(); } class Gato implements Animal { public function emiteSom() { echo 'Miaaauhh' ; } } class Cachorro implements Animal { public function emiteSom() { echo 'Au, Au' ; } } $a = new Gato(); $b = new Cachorro(); echo &quot; { $a ->emiteSom()} <br/>&quot; ; echo &quot; { $b ->emiteSom()} <br/>&quot; ; ?>
  23. 23. final <ul><li>Métodos final NÃO podem ser sobrescritos em classes que o herdem. </li></ul><ul><li>Classes final não podem ser herdadas por outras classes. </li></ul><ul><li>O exemplo abaixo não funciona: </li></ul><?php class ClasseBase { protected $id = 0 ; final function getId () { return $this ->id++; } } class ClasseConcreta extends ClasseBase { function getId () { return $this ->id += 2 ; } } ?>
  24. 24. final <ul><li>O exemplo abaixo também não funciona: </li></ul><?php final class ClasseBase { // ... } class ClasseConcreta extends ClasseBase { // ... } ?>
  25. 25. O método __toString() <ul><li>Retorna a representação de um objeto em forma de string. </li></ul><?php class Pessoa { private $nome ; function __construct( $nome ) { $this ->nome = $nome ; } function __toString() { return $this ->nome; } } $obj = new Pessoa( &quot;Maria&quot; ); echo $obj ; ?>
  26. 26. Clonagem de Objetos <ul><li>Uma cópia de objeto é criada usando o comando 'clone'. Isso chama o método __clone() do objeto. </li></ul><ul><li>O método __clone() de um objeto não pode ser executado diretamente. </li></ul>
  27. 27. Clonagem de Objetos <?php class Fone { public $numero , $tipo ; public function __construct( $numero , $tipo ) { $this ->numero = $numero ; $this ->tipo = $tipo ; } } class Pessoa { public $nome , $fone ; public function __construct( $nome , $num_fone , $tipo_fone ) { $this ->nome = $nome ; $this ->fone = new Fone( $num_fone , $tipo_fone ); } public function __clone() { $this ->fone = new Fone( $this ->fone->numero, $this ->fone->tipo); } } $p1 = new Pessoa( 'Maria' , '8633231845' , 'RES' ); $p2 = clone $p1 ; echo ( '<p>Objeto Original:</p>' ); print_r( $p1 ); echo ( '<p>Objeto Clonado:</p>' ); print_r( $p2 ); $p2 ->nome = 'João' ; $p2 ->fone->numero = '8699811234' ; $p2 ->fone->tipo = 'CEL' ; echo ( '<p>Objeto Original:</p>' ); print_r( $p1 ); echo ( '<p>Objeto Clonado:</p>' ); print_r( $p2 ); ?>
  28. 28. Interceptação <ul><li>Chamada de métodos e acesso a membros podem ser interceptados pelos métodos __set, __get e __call . </li></ul><ul><ul><li>__set – intercepta a atribuição de valores a propriedades do objeto (declaradas ou não). </li></ul></ul><ul><ul><li>__get – intercepta requisições de propriedades do objeto (declaradas ou não). </li></ul></ul><ul><ul><li>__call – Intercepta chamadas a métodos. Executado automaticamente quando um método inexistente for chamado. </li></ul></ul>
  29. 29. Interceptação <?php class Pessoa { private $atributos ; function __set( $nome , $valor ) { $this ->atributos[ $nome ] = $valor ; } function __get( $nome ) { return $this ->atributos[ $nome ]; } function __call( $nome , $params ) { echo &quot;Método chamado: $nome <br/>&quot; ; echo 'Parâmetros: ' ; print_r( $params ); } } $p1 = new Pessoa(); $p1 ->nome = 'Maria' ; $p1 ->fone = '8633231234' ; echo 'Nome: ' . $p1 ->nome . '<br/>' ; echo 'Fone: ' . $p1 ->fone . '<br/>' ; print_r( $p1 ); echo '<br/>' ; $p1 ->meuMetodo( 'PHP' , 123 , 'WEB' ); ?>
  30. 30. Instanciação Dinâmica <?php class MinhaClasse { function exibe( $a , $b ) { echo &quot;Parâmetros: $a $b <br/>&quot; ; } } $classe = 'MinhaClasse' ; $metodo = 'exibe' ; $obj = new $classe ; call_user_func( array ( $obj , $metodo ), 'PHP' , 'WEB' ); ?>
  31. 31. Tratamento de Erros <ul><li>A forma de manipulação de erro mais simples é abortar a execução da aplicação através da função die() . </li></ul><ul><li>Controlar erros assim é geralmente ruim, pois abortar a execução do programa normalmente não é o comportamento desejado. </li></ul>
  32. 32. Geração e Tratamento de Erros <ul><li>A função trigger_error() gera um erro de um tipo determinado. </li></ul><ul><li>Tipos de erro: </li></ul><ul><ul><li>E_USER_ERROR Gera um erro fatal. </li></ul></ul><ul><ul><li>E_USER_WARNING Gera uma advertência. </li></ul></ul><ul><ul><li>E_USER_NOTICE Gera uma notificação. </li></ul></ul><ul><li>A função set_error_handler() define uma função para tratamento de erros. </li></ul>
  33. 33. Geração e Tratamento de Erros <?php function trata_erros( $tipo_erro , $msg , $arq , $linha ) { echo $msg . '<br/>' ; if ( $tipo_erro == E_USER_ERROR) { die ; } } set_error_handler( 'trata_erros' ); trigger_error( 'Ocorreu um erro!!!' ,E_USER_WARNING); echo 'Código executado ou não' ; ?>
  34. 34. Exceções <ul><li>Uma exceção pode ser disparada (throw), ou capturada (catch). </li></ul><ul><li>Código rodeado de um bloco try/catch, permite a captura de exceções em potencial. </li></ul><ul><li>Vários blocos catch podem ser usados para pegar diferentes classes de exceções. </li></ul><ul><li>A execução normal continuará após o último bloco catch definido na seqüência. </li></ul><ul><li>Quando uma exceção é lançada, o fluxo normal de execução é interrompido e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada. </li></ul><ul><li>Se uma exceção não for capturada, um Erro Fatal será lançado com uma mensagem &quot;Uncaught Exception ...&quot;, a não ser que um tratador tenha sido definido com set_exception_handler() . </li></ul>
  35. 35. Exceções <ul><li>Uma exceção é um objeto da classe Exception que contém os seguintes métodos: </li></ul><ul><li>getMessage() - Retorna a mensagem de erro. </li></ul><ul><li>getCode() - Retorna o código de erro. </li></ul><ul><li>getFile() - Retorna o arquivo no qual ocorreu o erro. </li></ul><ul><li>getLine() - Retorna a linha na qual ocorreu o erro. </li></ul><ul><li>getTrace() - Retorna um array com as ações até o erro. </li></ul><ul><li>getTraceAsString() - Retorna as ações em forma de string. </li></ul>
  36. 36. Exceções <?php function inverso( $x ) { if ( $x == 0 ) { throw new Exception( 'Divisão por zero.' ); } else return 1 / $x ; } try { echo inverso( 5 ) . '<br/>' ; echo inverso( 0 ) . '<br/>' ; } catch (Exception $e ) { echo $e ->getMessage(), '<br/>' ; } echo 'Fim.' ; ?>
  37. 37. Tratador de Exceções <ul><li>A função set_exception_handler() define uma função de tratamento de exceção padrão se uma exceção não for capturada em um bloco try/catch. </li></ul><ul><li>A execução não parará depois que a função de tratamento for chamada. </li></ul><?php function trata_excecoes ( $ex ) { echo $ex ->getMessage(), '<br/>' ; } set_exception_handler( 'trata_excecoes' ); throw new Exception( 'Exceção ocorreu!!!' ); echo 'Código não executado' ; ?>
  38. 38. Comparação de Objetos <ul><li>Operador de comparação (==) </li></ul><ul><ul><li>Objetos são iguais se possuírem o mesmo conteúdo e forem instâncias da mesma classe. </li></ul></ul><ul><li>Operador de identidade (===) </li></ul><ul><ul><li>Objetos são idênticos se referenciam a mesma instância de uma mesma classe. </li></ul></ul>
  39. 39. Comparação de Objetos <?php class Pessoa { private $nome ; function __construct( $nome ) { $this ->nome = $nome ; } } $p1 = new Pessoa( 'Maria' ); $p2 = $p1 ; $p3 = new Pessoa( 'Maria' ); echo '$p1 == $p2 - ' . ( $p1 == $p2 ) . '<br/>' ; echo '$p1 == $p3 - ' . ( $p1 == $p3 ) . '<br/>' ; echo '$p1 === $p2 - ' . ( $p1 === $p2 ) . '<br/>' ; echo '$p1 === $p3 - ' . ( $p1 === $p3 ) . '<br/>' ; ?>
  40. 40. Comparação de Tipo <?php class Pessoa { } class PessoaFisica extends Pessoa { } $p1 = new PessoaFisica(); var_dump( $p1 instanceof Pessoa); var_dump( $p1 instanceof PessoaFisica); var_dump( $p1 instanceof PessoaJuridica); ?> <ul><li>instanceof é usado para determinar se um objeto é de uma determinada classe: </li></ul>

×