Anda di halaman 1dari 12

Captulo 3

Mtodos mgicos

3.1 O que so mtodos mgicos?

Mtodos mgicos so mtodos chamados automaticamente pelo PHP em diferentes


momentos durante a vida de um objeto. Dependendo de uma funo ou evento, o
PHP ir disparar a chamada do mtodo mgico apropriado.

Eles so muito teis para moldarmos o comportamento de nossos objetos. Todos os


mtodos mgicos so precedidos por dois caracteres underline.

3.2 Construtor e destrutor

Os mtodos construtores e destrutores ocorrem durante a criao e remoo de um


objeto na memria.

23
3.2 Construtor e destrutor 4Linux www.4linux.com.br

3.2.1 __construct

O mtodo mgico __construct, comumente chamado de mtodo construtor, execu-


tado pelo PHP toda vez que um objeto instanciado.

1 <? php
2
3 class Carro {
4 public function __construct () {
5 echo Instanciamos um novo objeto ! ;
6 }
7 }
8
9 $fiesta = new Carro () ;

Existe tambm outra forma de denir um mtodo construtor, que a criao de


um mtodo com o mesmo nome da classe. Esta forma mais comum em outras
linguagens, como Java e C#. Contudo, em PHP a forma mais utilizada atravs do
mtodo mgico __construct.

1 <? php
2
3 class Carro {
4 public function Carro () {
5 echo Instanciamos um novo objeto ! ;
6 }
7 }
8
9 $fiesta = new Carro () ;

Pgina 24 Desenvolvimento Orientado a Objetos com PHP


4Linux www.4linux.com.br 3.3 Get e set

3.2.2 __destruct

O mtodo mgico __destruct, comumente chamado de destrutor, executado pelo


PHP toda vez que um objeto destrudo. Um objeto destrudo quando todas as
referncias a ele so desfeitas.

1 <? php
2
3 class Carro {
4 public function __construct () {
5 echo Instanciamos um novo objeto ! ;
6 }
7
8 public function __destruct () {
9 echo Destru mos o objeto ! ;
10 }
11 }
12
13 $fiesta = new Carro () ;

3.3 Get e set

Os mtodos mgicos get e set servem para fazer uma manipulao dinmica das
propriedades de um objeto.

3.3.1 __set

O mtodo mgico __set executado pelo PHP toda vez que uma propriedade inde-
nida passada a um objeto. Por exemplo:

Desenvolvimento Orientado a Objetos com PHP Pgina 25


3.3 Get e set 4Linux www.4linux.com.br

1 <? php
2
3 class Carro {
4 public function __set ( $propriedade , $valor ) {
5 echo " O valor de $propriedade $value " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 $fiesta -> ArCondicionado = true ;

3.3.2 __get

O mtodo mgico __get executado pelo PHP toda vez que se tenta acessar uma
propriedade indenida de um objeto. Por exemplo:

1 <? php
2
3 class Carro {
4 public function __get ( $propriedade ) {
5 echo " A propriedade $propriedade n o existe " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 echo $fiesta - > ArCondicionado ;

Pgina 26 Desenvolvimento Orientado a Objetos com PHP


4Linux www.4linux.com.br 3.4 Isset e unset

3.4 Isset e unset

Os mtodos mgicos isset e unset, assim como os mtodos get e set, esto rela-
cionados s propriedades de um objeto. Servem para manipular dinamicamente as
propriedades de um determinado objeto.

3.4.1 __isset

O mtodo mgico __isset executado pelo PHP toda vez que usa-se a funo isset()
ou empty() em uma propriedade indenida. Por exemplo:

1 <? php
2
3 class Carro {
4 public function __isset ( $propriedade ) {
5 return " Voc est tentando verificar a exist ncia da propriedade
$propriedade " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 echo isset ( $fiesta - > ArCondicionado ) ;

3.4.2 __unset

O mtodo mgico __unset executado pelo PHP toda vez que usa-se a funo
unset() em uma propriedade indenida. Por exemplo:

1 <? php

Desenvolvimento Orientado a Objetos com PHP Pgina 27


3.5 Call e callStatic 4Linux www.4linux.com.br

2
3 class Carro {
4 public function __unset ( $propriedade ) {
5 echo " Voc est tentando apagar a propriedade $propriedade " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 unset ( $fiesta - > ArCondicionado ) ;

3.5 Call e callStatic

Os mtodos mgicos call e callStatic servem para fazer uma manipulao dinmica
dos mtodos de um objeto.

3.5.1 __call

O mtodo mgico __call executado pelo PHP toda vez que um mtodo indenido
chamado. Por exemplo:

1 <? php
2
3 class Carro {
4 public function __call ( $metodo , $argumentos ) {
5 echo " O m todo $metodo recebe o argumento $argumentos [0] " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 echo $fiesta - > ligarCarro (1) ;

Pgina 28 Desenvolvimento Orientado a Objetos com PHP


4Linux www.4linux.com.br 3.6 Sleep e wakeup

3.5.2 __callStatic

O mtodo mgico __callStatic executado pelo PHP toda vez que um mtodo est-
tico indenido chamado. Por exemplo:

1 <? php
2
3 class Carro {
4 public static function __callStatic ( $metodo , $argumentos ) {
5 echo " O m todo $metodo recebe o argumento $argumentos [0] " ;
6 }
7 }
8
9 echo Carro :: ligarCarro (1) ;

3.6 Sleep e wakeup

Os mtodos mgicos __sleep e __wakeup permitem que manipulemos a forma como


objetos so serializados e deserializados no PHP.

3.6.1 __sleep

O mtodo mgico __sleep executado pelo PHP toda vez que usa-se a funo
serialize() em um objeto. Objetos no podem ser serializados automaticamente no
PHP, portanto, voc precisa especicar uma maneira de serializ-los e o mtodo
mgico __sleep ir ajud-lo a fazer isso.

O mtodo mgico __wakeup faz o inverso, executado pelo PHP toda vez que usa-
se a funo unserialize() em um objeto. Reinstanciando o objeto e alocando as
propriedades salvas pelo __sleep.

Desenvolvimento Orientado a Objetos com PHP Pgina 29


3.6 Sleep e wakeup 4Linux www.4linux.com.br

1 <? php
2
3 class Carro {
4 private $nome ;
5 private $marca ;
6 private $cor ;
7
8 public function __construct ( $nome , $marca , $cor ) {
9 $this - > nome = $nome ;
10 $this - > marca = $marca ;
11 $this - > cor = $cor ;
12
13 $this - > criar () ;
14 }
15
16 public function criar () {
17 echo " Criamos um { $this - > nome } da { $this - > marca } pintado de {
$this - > cor } " ;
18 }
19
20 public function __sleep () {
21 return array ( nome , marca , cor ) ;
22 }
23
24 public function __wakeup () {
25 $this - > criar () ;
26 }
27 }
28
29 $fiesta = new Carro ( " Fiesta " , " Ford " , " Azul " ) ;
30 $serial = serialize ( $fiesta ) ;
31
32 unset ( $fiesta ) ;
33
34 $fiesta = unserialize ( $serial ) ;

Pgina 30 Desenvolvimento Orientado a Objetos com PHP


4Linux www.4linux.com.br 3.7 ToString

3.7 ToString

O mtodo mgico __toString executado pelo PHP toda vez que se tenta dar um
echo em um objeto. Por exemplo:

1 <? php
2
3 class Carro {
4 public function __toString () {
5 return " Criamos nosso objeto e demos echo nele " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 echo $fiesta ;

3.8 Invoke

O mtodo mgico __invoke executado pelo PHP toda vez tentamos acessar nosso
objeto como se fosse um closure. Por exemplo:

1 <? php
2
3 class Carro {
4 public function __invoke ( $valor ) {
5 echo " Voc passou como par metro o valor $valor " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 $fiesta ( 2500 ) ;

Desenvolvimento Orientado a Objetos com PHP Pgina 31


3.9 Clone 4Linux www.4linux.com.br

Mltiplos parmetros devem ser previstos na denio do prprio mtodo, ao contr-


rio do mtodo mgico __call que recebe um array de parmetros.

1 <? php
2
3 class Carro {
4 public function __invoke ( $valor , $outrovalor ) {
5 echo " Voc passou como par metro o valor $valor e $outrovalor " ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 $fiesta ( 2500 , Ar Condicionado ) ;

3.9 Clone

O mtodo mgico __clone executado pelo PHP toda vez que um objeto clo-
nado.

1 <? php
2
3 class Carro {
4 public function __clone () {
5 echo Clonamos um objeto ! ;
6 }
7 }
8
9 $fiesta = new Carro () ;
10 $palio = clone $fiesta ;

Pgina 32 Desenvolvimento Orientado a Objetos com PHP


4Linux www.4linux.com.br 3.10 Autoload

3.10 Autoload

O mtodo mgico __autoload executado pelo PHP toda vez que um objeto ins-
tanciado a partir de uma classe. O PHP ir chamar o mtodo __autoload e passar
para ele o nome da classe como parmetro.

1 <? php
2
3 function __autoload ( $classe ) {
4 echo " Voc tentou instanciar um objeto da classe $classe " ;
5 }
6
7 $fiesta = new Carro () ;

Podemos utilizar o mtodo mgico __autoload para fazer carregamento automtico


dos arquivos que contm nossas classes, desde que os nomes dos arquivos sejam
iguais aos das classes:

1 <? php
2
3 function __autoload ( $classe ) {
4 require_once ( " classes / $classe . php " ) ;
5 }
6
7 $fiesta = new Carro () ;

Desenvolvimento Orientado a Objetos com PHP Pgina 33