Tanto chamada de métodos e acesso a membros podem ser sobrecarregados pelos métodos
__call, __get e __set. Esses métodos só serão
disparados quando seu objeto ou o objeto herdado não contiver o
membro ou método que você está tentando acessar.
Todos os métodos sobrecarregados devem ser definidos
estáticos.
A partir do PHP 5.1.0 também é possível sobrecarregar as
funções isset() and unset() através
dos métodos __isset e __unset respectivamente.
void
__set ( string name, mixed value )
mixed
__get ( string name )
bool
__isset ( string name )
void
__unset ( string name )
Membros de classes podem ser sobrecarregados para executar código específico definido
na sua classe definindo esses métodos especialmente nomeados. O parâmetro $name
usado é o nome da variável que deve ser configurada ou recuperada.
O parâmetro $value
do método __set() especifica o
valor que o objeto deve atribuir à variável $name
.
Exemplo 19-19. Exemplo de sobrecarga com __get, __set, __isset e __unset
<?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3);
private function __get($nm) { echo "Getting [$nm]\n";
if (isset($this->x[$nm])) { $r = $this->x[$nm]; print "Returning: $r\n"; return $r; } else { echo "Nothing!\n"; } }
private function __set($nm, $val) { echo "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) { $this->x[$nm] = $val; echo "OK!\n"; } else { echo "Not OK!\n"; } }
private function __isset($nm) { echo "Checking if $nm is set\n";
return isset($this->x[$nm]); }
private function __unset($nm) { echo "Unsetting $nm\n";
unset($this->x[$nm]); } }
$foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++;
var_dump(isset($foo->a)); //true unset($foo->a); var_dump(isset($foo->a)); //false
// Isso não passa pelo método __isset() // porque 'n' é uma proriedade pública var_dump(isset($foo->n));
var_dump($foo); ?>
|
O exemplo acima irá imprimir:
Setting [a] to 100 OK! Getting [a] Returning: 100 Setting [a] to 101 OK! Getting [z] Nothing! Setting [z] to 1 Not OK!
Checking if a is set bool(true) Unsetting a Checking if a is set bool(false) bool(true)
object(Setter)#1 (2) { ["n"]=> int(1) ["x:private"]=> array(2) { ["b"]=> int(2) ["c"]=> int(3) } }
|
|
mixed
__call ( string name, array arguments )
Membros de classes podem ser sobrecarregados para executar código específico definido
na sua classe definindo esses métodos especialmente nomeados. O parâmetro
$name
usado é o nome da função que foi requerida
a ser usada. Os argumentos que foram passado na função serão definidos
como um array no parâmetro $arguments
.
O valor retorna do método __call() será retornado ao
chamador do método.
Exemplo 19-20. Exemplo de sobrecarga com __call
<?php class Caller { private $x = array(1, 2, 3);
function __call($m, $a) { print "Método $m chamado:\n"; var_dump($a); return $this->x; } }
$foo = new Caller(); $a = $foo->teste(1, "2", 3.4, true); var_dump($a); ?>
|
O exemplo acima irá imprimir:
Método teste chamado: array(4) { [0]=> int(1) [1]=> string(1) "2" [2]=> float(3.4) [3]=> bool(true) } array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
|
|