Академический Документы
Профессиональный Документы
Культура Документы
http://www.georgemendonca.com.br
Orientação a Objetos
• Introdução
– Versão atual: PHP 5.3 - http://www.php.net/releases.
• 5.3.0 (30/06/2009)
• 5.3.1 (19/11/2009)
• 5.3.2 (04/04/2010)
• 5.3.3 (22/07/2010)
• 5.3.4 (09/12/2010)
• 5.3.5 (06/01/2011)
• 5.3.6 (17/03/2011)
2
Orientação a Objetos
• Introdução
– Possui suporte a OO desde a versão 3.
3
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 4 - Classes simples:
– Uma tentativa a orientação à objetos
4
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
Diagrama de Classe <?php
Class Php4
{
/**
* Atributos simples
*/
var $a;
var $b;
var $c;
/**
* Método construtor da classe PHP 4
* Métodos simples
*/
function Php4()
{
}
}
5
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 5 - Classes mais completas e uso de padrões:
6
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
Diagrama de Classe <?php
Class Php5
{
/**
* Visibilidade de atributos (encapsulamento)
*/
public $a;
protected $b;
private $c;
/**
* Método construtor da classe PHP 5
* Visibilidade de métodos
*/
public function __construct()
{
}
}
7
Orientação a Objetos
• Escrevendo uma classe
– A definição de uma classe em PHP começa com a
palavra-chave class, seguido do nome_da_classe,
que pode ser qualquer nome que não seja uma
palavra reservada no PHP.
8
Orientação a Objetos
• Escrevendo uma classe
<?php
class Nome_da_Classe
{
encapsulamento $atributo1;
...
encapsulamento function nome_metodo( [argumento1, ...] )
{
/**
* Implementação do comportamento do método.
* Como uma função, um método pode retornar
* um valor se necessário.
*/
[return]
}
...
}
9
Orientação a Objetos
• A variável $this
– Uma pseudo variável $this está disponível quando
um método da classe é chamado dentro de um
contexto de objeto.
10
Orientação a Objetos
• A variável $this
<?php
Class Nome_da_Classe
{
encapsulamento $atributo1;
...
encapsulamento function nome_metodo()
{
// A variável $this referencia o objeto
// chamado em tempo de execução no script.
return $this->atributo1;
}
...
}
11
Orientação a Objetos
• A variável $this
– Observação importante para o entendimento:
• Há uma certa dificuldade em entender a utilização desta variável
em uma classe em qualquer linguagem de programação. Então:
12
Orientação a Objetos
• Encapsulamento de atributos e métodos
– O encapsulamento (ou visibilidade) de um atributo ou de
um método pode ser definido prefixando a declaração
com as palavras-chave:
• public, protected e private.
13
Orientação a Objetos
• Encapsulamento de atributos e métodos
Diagrama de Classe <?php
Class Encapsulamento
{
// Visível em todo o script
public $atributoPublico;
15
Orientação a Objetos
• Construtores e Destrutores
<?php
Diagrama de Classe Class ConstrutorDestrutor
O construtor da classe
{ inicializa os valores dos
private $a; atributos do objeto caso
private $b; necessário.
17
Orientação a Objetos
• Instanciando o objeto da classe
– Editor utilizado: Eclipse (Eclipse for PHP Developers)
– Estrutura de pasta proposta para os exemplos:
– Boas práticas:
• Criar uma classe por arquivo e nomear arquivo com o nome da classe
– Ex.: MinhaClasse.php
• Tipificar as variáveis PHP na nomenclatura da variável
– Ex.: $aCidades [ ] = $oCidade (array de cidades recebe objeto cidade)
• Utilize caminho relativo na inclusão de arquivos
– "./pasta/arquivo.php"
• Se tiver somente código PHP não feche a tag PHP (porque?) 18
Orientação a Objetos
• Instanciando o objeto da classe
<?php
require_once './class/php4.php';
require_once './class/php5.php';
require_once './class/Encapsulamento.php';
require_once './class/ConstrutorDestrutor.php';
echo "<pre>";
print_r($oPhp4);
print_r($oPhp5);
print_r($oEncap);
print_r($oConstr);
$oConstr->__destruct();
print_r($oConstr); 19
Orientação a Objetos
• Instanciando o objeto da classe
Saída:
Php4 Object
(
[a] =>
[b] =>
[c] =>
)
Php5 Object
(
[a:Php5:private] =>
[b:Php5:private] =>
[c:Php5:private] =>
)
Encapsulamento Object
(
[atributoPublico] =>
[atributoProtegido:protected] =>
[atributoPrivado:Encapsulamento:private] =>
) 20
Orientação a Objetos
• Exercitando Diagrama de Classe
21
Orientação a Objetos
• Herança - Conceitos
22
Orientação a Objetos
• Herança - Conceitos
– Tal conceito é conhecido também como Generalização.
23
Orientação a Objetos
• Herança no PHP
– Em PHP uma classe pode herdar propriedades e métodos de
outra classe usando a palavra-chave extends na sua
declaração.
<?php
26
Orientação a Objetos
• Herança no PHP
– Exemplo: Implementação prática.
<?php
class Dependentes extends Funcionario {
– Erro:
Saída:
Catchable fatal error: Object of class Funcionario could not be converted to string in \var\www\...
– Resultado: Saída:
Classe Funcionario 29
Orientação a Objetos
• Referência do objeto
– Sempre que uma variável do tipo objeto é atribuída a
uma outra variável, ele recebe somente a referência
deste objeto.
– Tais variáveis referenciam exatamente o mesmo
objeto.
<?php
require_once './class/Funcionario.php';
Saída:
A matrícula do funcionário é: RH 30
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.
<?php // appClonagemObjeto.php
Um novo objeto é
require_once './class/Funcionario.php'; criado através da
clonagem do primeiro.
$oFuncionario = new Funcionario();
$oNovoFuncionario = clone $oFuncionario;
$oFuncionario->setDepartamento('RH');
$oNovoFuncionario->setDepartamento('Informática');
echo "Departamento: {$oFuncionario->getDepartamento()} <br />";
echo "Departamento: {$oNovoFuncionario->getDepartamento()}";
Saída:
Departamento: RH
31
Departamento: Informática
Orientação a Objetos
• Atributos e Métodos Estáticos
32
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->”.
33
Orientação a Objetos
• Atributos e Métodos Estáticos
Diagrama de Classe
<?php // appMatematica.php
$num1 = 4;
$num2 = 5;
echo Matematica::soma($num1, $num2);
Saída:
9
34
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.
35
Orientação a Objetos
• Overloading (Sobrecarga)
– Sobrecarga de atributos:
37
Orientação a Objetos
• Overloading (Sobrecarga)
– Sobrecarregando <?php // FuncionarioOverloading.php
class FuncionarioOverloading
os atributos da {
private $matricula = null;
private $nome = null;
classe Funcionario private $rg = null;
protected $departamento = null;
dos exemplos
public function __construct( ) { }
echo "<pre>";
print_r($oFuncionario);
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ça
- RG: 1234567
40
- Departamento: Informática
Orientação a Objetos
• Iteração de Objetos
41
Orientação a Objetos
• Iteração de Objetos
Diagrama de Classe <?php
Class Iteracao
{
public $nome = "George";
public $casado = true;
public $idade = 28;
}
<?php // appIteracaoObjetos.php
Saída:
require_once './class/IteracaoObjetos.php';
nome : George
$oIteracao = new IteracaoObjetos();
casado : 1
idade : 28
foreach ($oIteracao as $atributo => $valor) {
print "$atributo : $valor <br />";
}
elementos em PHP5.
<?php // appReflexao.php
require_once './class/IteracaoObjetos.php';
require_once './class/FuncionarioOverloading.php';
46
Orientação a Objetos
• Reflection API
Saída:
47
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.
49
Orientação a Objetos
• Autoload – Carregando classes
automaticamente
– Implementação a função autoload:
<?php
function __autoload( $classe )
{
require_once "./class/{$classe}.php";
}
Saída:
Classe Funcionario
16
Funcionario Object
(
[matricula:Funcionario:private] =>
[nome:Funcionario:private] =>
[rg:Funcionario:private] =>
[departamento:protected] =>
)
51
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
– Permite referenciar uma classe chamada no contexto
de herança estática.
52
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.
54
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
55
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
<?php <?php // appLateStaticBindings.php
class X // X.php require_once './func/autoload.php';
{
public static function imprimeClasse() TesteX::chamaClasse();
{
echo 'Eu sou a classe '.__CLASS__;
}
57
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
<?php <?php // appLateStaticBindings.php
class Y // Y.php require_once './func/autoload.php';
{
public static function imprimeClasse() TesteX::chamaClasse();
{ echo '<br />';
echo 'Eu sou a classe '.__CLASS__; TesteY::chamaClasse();
}
// 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 ";
}
61
Orientação a Objetos
• Constantes do Objeto Saída:
– Implementação básica:
<?php // appConstantesdaClasse.php
require_once './func/autoload.php';
echo "
<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>";
62
Orientação a Objetos
• Classes e Métodos Abstratos
– PHP 5 introduz métodos e classes abstratos.
65
Orientação a Objetos
• Classes e Métodos Abstratos
– Exemplo 01 - Classe Orcamento
<?php // Classe Orcamento.php
class Orcamento extends Venda
{
private $taxa = array('cheque' => 1.10, 'cartao' => 1.18 );
<?php // appOrcamento.php
require_once './func/autoload.php';
$oOrcamento = new Orcamento(); Saída:
67
Orientação a Objetos
• Classes e Métodos Abstratos
– Exemplo 02 – Método abstrato imprimeOrcamento
// Classe Abstrata Venda.php
abstract class Venda
{
private $valor = 0.0;
private $desconto = 0.0;
70
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.
Nota: Uma classe não pode implementar duas interfaces que compartilham
o mesmo nome uma vez que isso causaria ambiguidade.
72
Orientação a Objetos
• Interfaces
– Exemplo 01 - Interface OperacoesMatematicas
<?php //IOperacoesMatematicas.php
interface IOperacoesMatematicas
{
public static function soma($x, $y);
73
Orientação a Objetos
• Interfaces
– Exemplo 01 – Classe OpMatematicas que implementa a
interface OperacoesMatematicas
<?php // OpMatematicas.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; }
Saída:
Anúncio imobiliário:
78
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.
81
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!');
}
}
}
82
Orientação a Objetos
• Exceções
– Criando uma aplicação para disparar a Exceção
<?php
require_once './func/autoload.php';
try {
$oDivisao = 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:
85