Sobrecarga

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.

Sobrecarga de método

void __set ( string name, mixed value )

void __get ( mixed 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-18. Exemplo de sobrecarga com __get e __set

<?php
class Setter
{
    
public $n;
    
private $x = array("a" => 1, "b" => 2, "c" => 3);

    function
__get($nm)
    {
        print
"Pegando [$nm]\n";

        if (isset(
$this->x[$nm])) {
            
$r = $this->x[$nm];
            print
"Retornando: $r\n";
            return
$r;
        } else {
            echo
"Nada!\n";
        }
    }

    function
__set($nm, $val)
    {
        print
"Atribuindo à [$nm] o valor $val\n";

        if (isset(
$this->x[$nm])) {
            
$this->x[$nm] = $val;
            echo
"OK!\n";
        } else {
            echo
"Não funcionou\n";
        }
    }
}

$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>

Terá a seguinte saída:

Atribuindo à [a] o valor 100
OK!
Pegando [a]
Retornando: 100
Atribuindo à [a] o valor 101
OK!
Pegando [z]
Nada!
Atribuindo à [z] o valor 1
Não funcionou!
object(Setter)#1 (2) {
  ["n"]=>
  int(1)
  ["x:private"]=>
  array(3) {
    ["a"]=>
    int(101)
    ["b"]=>
    int(2)
    ["c"]=>
    int(3)
  }
}

Sobrecarga de método

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-19. 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);
?>

Terá a seguinte saída:

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)
}