O documento resume os principais conceitos de orientação a objetos em PHP, incluindo: (1) definição de classes e instanciação de objetos, (2) herança, que permite classes filhas herdar atributos e métodos de classes pai, e (3) encapsulamento, que esconde o estado de um objeto e requer acesso via métodos.
1. Orientação a Objetos em PHP
Grupo de Usuários de PHP de Mato Grosso do Sul
03/10/09 – José Ricardo da Silva- 2º Workshop do PHPMS - Senac – Campo Grande/MS - Brasil
2. Conteúdo abordado
✔ Introdução à OO
✔ Definição de classes e instanciação de objetos
✔ Palavras-chave e operadores relativos à OO em PHP
✔ Herança
✔ Interfaces
✔ Conclusões
✔ Perguntas
3. Intro
✔ Olhe a sua volta. O que você vê?
✔ Objetos reais possuem duas características
✔ Estado
✔ Comportamento
✔ Cachorros
✔ Nome, cor, raça, estão com fome, estão felizes, etc
✔ Latem, buscam coisas, balançam o rabo
4. Objetos
✔ Objetos podem ser muito simples
✔ Uma lamparina
✔ Estados: acesa ou apagada
✔ Comportamento: pode ser ligada e desligada
✔ Ou muito complexos
✔ Vários estados e vários comportamentos
✔ Podem conter outros objetos
✔ Interagem com outros objetos
✔ Herdam propriedades e comportamentos de outros objetos
7. Objetos em software
✔ O estado é armazenado em variáveis
✔ E o comportamento é definido através de métodos
8. Classes
✔ Templates de objetos
✔ Definem estado
✔ Atributos
✔ De objetos e da própria classe
✔ E comportamento
✔ Métodos
✔ De objetos e da própria clase
✔ Palavra-chave: class e new
✔ Novidades: $this e ->
9. class Cachorro {
var $nome;
var $cor;
var $raca;
var $estaComFome = false;
var $estaFeliz = true;
}
$meuCachorro = new Cachorro();
$meuCachorro -> nome = “bidu”;
$meuCachorro -> cor = “marrom”;
$meuCachorro -> raca = “vira-latas”;
10. Objeto
✔ Uma instância de uma classe
✔ Armazena dados
✔ Ocupa espaço na memória
Animal
CachorroSubclasse
Objeto
11. class Cachorro {
var $nome;
var $cor;
var $raca;
var $estaComFome = false;
var $estaFeliz = true;
}
$meuCachorro = new Cachorro();
$meuCachorro -> nome = “bidu”;
$meuCachorro -> cor = “marrom”;
$meuCachorro -> raca = “vira-latas”;
PHP 4? WTF?
16. class Cachorro {
private $raca;
private $estaComFome = true;
private $estaFeliz = false;
private $racas = array('vira-latas',
'pastor alemão', 'pitbull');
public function definaRaca($raca) {
if (in_array($raca, $this -> racas))
$this -> raca = $raca;
}
public function comer() {
$estaComFome = false;
$estaFeliz = true;
}
}
$meuCachorro = new Cachorro();
$meuCachorro -> definaRaca('pitbull');
$meuCachorro -> comer();
17. class Cachorro {
public $racas = array('vira-latas',
'pastor alemão', 'pitbull');
public function definaRaca($raca) { … }
...
}
$meuCachorro = new Cachorro();
$meuCachorro -> definaRaca($meuCachorro -> racas[1]);
echo $meuCachorro -> racas[2];
new SplMaxHeap();
18. Encapsulamento - Benefícios
✔ O estado é o que diferencia um objeto de outro
✔ Inclusive de um objeto inválido
✔ Mantém-se o controle sobre como o “mundo”
manipula o objeto
✔ Cachorro de cor “livro” ou de raça “abacate”?
✔ Assume-se que o método funciona
✔ “Como” não é importante, é?
✔ Pressupostos sobre o funcionamento podem trazer
problemas
✔ Manipulação externa de estado → dor de cabeça
19. Atributos e Métodos de Classe
✔ Sem instanciação de objeto
✔ Palavra-chave: static
✔ Default: public
27. Herança
✔ No mundo real é comum encontrarmos objetos com
características em comum
Veiculo
Carro Moto Bicicleta Avião
$velocidade
acelerar()
freiar()
$cor
28. Herança
✔ Hierarquia de classes
✔ Uma super-classe é uma generalização de uma ou mais
subclasses
✔ Subclasses
✔ Herdam os atributos e os métodos de suas super-classes
✔ Podem definir novos atributos e métodos
✔ Mecanismo de reuso
✔ Aumenta a complexidade
29. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction();
$this -> proFunction();
$this -> pubFunction();
}
}
$obj = new Base();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função publica chamada
30. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction();
$this -> proFunction();
$this -> pubFunction();
}
}
$obj = new Base();
$obj -> varProtegida = 'novo valor';
$obj -> outraFuncao();
31. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction();
$this -> proFunction();
$this -> pubFunction();
}
}
$obj = new Base();
echo $obj -> varProtegida;
$obj -> outraFuncao();
32. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction();
$this -> proFunction();
$this -> pubFunction();
}
}
$obj = new Base();
$obj -> proFunction();
$obj -> outraFuncao();
33. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base { }
$obj = new Classe1();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função publica chamada
34. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
}
$obj = new Classe1();
$obj -> outraFuncao();
class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
public function pubFunction() {
echo "Função {$this -> varPublica} da classe filha chamadan";
}
}
$obj = new Classe1();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função publica da classe filha chamada
35. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
public function pubFunction() {
echo "Função {$this -> varProtegida} da classe filha chamadan";
}
}
$obj = new Classe1();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função protegida da classe filha chamada
36. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
public function pubFunction() {
echo "Função {$this -> varPrivada} da classe filha chamadan";
}
}
$obj = new Classe1();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função da classe filha chamada
37. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
public function pubFunction() {
$this -> proFunction();
}
}
$obj = new Classe1();
$obj -> outraFuncao();
Função privada chamada
Função protegida chamada
Função protegida chamada
38. class Base {
private $varPrivada = 'privada';
protected $varProtegida = 'protegida';
public $varPublica = 'publica';
private function priFunction() {
echo "Função {$this -> varPrivada} chamadan";
}
protected function proFunction() {
echo "Função {$this -> varProtegida} chamadan";
}
public function pubFunction() {
echo "Função {$this -> varPublica} chamadan";
}
public function outraFuncao() {
$this -> priFunction(); $this -> proFunction(); this -> pubFunction();
}
}
class Classe1 extends Base {
public function pubFunction() {
$this -> priFunction();
}
}
$obj = new Classe1();
$obj -> outraFuncao();
Fatal Error!
39. abstract class Veiculo {
protected $velocidade;
abstract public function acelerar($qtde);
}
abstract class VeiculoMotorizado extends Veiculo {
protected $nivelDoTanque;
public function nivelDoTanque() {
return $this -> nivelDoTanque;
}
}
class Moto extends VeiculoMotorizado {
public function gireAcelerador($qtde) { … }
public function acelerar($qtde) {
$this -> velocidade += $this -> gireAcelerador($qtde);
}
}
class Carro extends VeiculoMotorizado {
public function piseAcelerador($qtde) { ... }
public function acelerar($qtde) {
$this -> velocidade += $this -> piseAcelerador($qtde);
}
}
$obj = new Carro();
$obj -> acelerar(2);
echo $obj -> nivelDoTanque();
40. Interfaces
✔ Um contrato
✔ Especificam quais métodos uma classe deve
implementar
✔ Não definem como os métodos devem ser
implementados
✔ São definidas de maneira similar à definição de
classes
✔ Palavras-chave: interface e implements
✔ Métodos sem corpo
✔ Todos os métodos são públicos
41. interface Bicicleta {
public function mudarDirecao($valor);
public function acelerar($incremento);
public function freiar($decremento);
}
class Trek implements Bicicleta {
public function mudarDirecao($valor) {…}
public function acelerar($incremento) {
// trocando de marcha
$this -> trocaMarcha($this -> marcha - 1);
// acelerando...
}
public function freiar($decremento) { … }
}
class BarraForte implements Bicicleta {
public function mudarDirecao($valor) {…}
public function acelerar($incremento) { … }
public function freiar($decremento) {
// colocando o pé no chão $decremento vezes
$this -> coloqueOPeNoChao($decremento);
}
}
42. interface Produto {
public function definirPreco($valor);
public function obterPreco($valor);
}
interface Veiculo {
public function mudarDirecao($valor);
public function acelerar($incremento);
public function freiar($decremento);
}
interface Bicicleta extends Veiculo {
public function empinar($grau);
}
interface BicicletaComMarchas extends Bicicleta, Produto {
public function trocarMarcha($incOuDec);
}
43. class Caloi implements BicicletaComMarchas {
public function definirPreco($valor) {
// …
}
public function obterPreco($valor) { … }
public function mudarDirecao($valor) { … }
public function acelerar($incremento) { … }
public function freiar($decremento) { … }
public function empinar($grau) { … }
public function trocarMarcha($incOuDec) { … }
}
44. interface Bicicleta {
const TIPO = “terrestre”;
public function mudarDirecao($valor);
public function acelerar($incremento);
public function freiar($decremento);
}
class BarraForte implements Bicicleta {
const TIPO = “anfíbio”;
public function mudarDirecao($valor) {…}
public function acelerar($incremento) { … }
public function freiar($decremento) {
// colocando o pé no chão $decremento vezes
$this -> coloqueOPeNoChao($decremento);
}
}
45. interface Produto {
public function comprar();
public function definirNome($nome);
public function vender();
}
interface Objeto {
public function girar($direcao);
public function definirNome($nome);
public function remover();
}
interface Bicicleta extends Objeto, Produto {
} ?
46. Final
✔ Introduzida no PHP5
✔ Previne que classes filhas sobrescrevam um método
✔ Previne que classes sejam extendidas
✔ Não se aplica a propriedades
47. class Base {
public function test() {
echo "test() foi invocada";
}
final public function maisTestes() {
echo "Mais testes";
}
}
class Filha extends Base {
public function maisTestes() {
echo "oh-oh";
}
}
49. Conclusões
✔ Construção de software a partir de objetos que
interagem entre si
✔ Cada um é responsável pela
✔ Manutenção de seu estado
✔ Execução de suas operações
✔ Maior manutenibilidade
✔ Objetos são entidades que encapsulam funcionalidades
✔ Componentes reusáveis
✔ Se um objeto “quebra”, troque-o
✔ Mapeamento
entidades do mundo real → objetos do sistema