Forum und email

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. Todos os métodos sobrecarregados devem ser definidos estáticos. Todos os métodos sobrecarregados devem ser definidos public.

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. O método __isset também é chamado com a função empty().

Sobrecarga de membros

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.

Nota: O método __set() não pode obter argumentos por referência.

Example#1 Exemplo de sobrecarga com __get, __set, __isset e __unset

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

    public 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";
        }
    }

    public 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";
        }
    }

    public function 
__isset($nm)
    {
        echo 
"Checking if $nm is set\n";

        return isset(
$this->x[$nm]);
    }

    public function 
__unset($nm)
    {
        echo 
"Unsetting $nm\n";

        unset(
$this->x[$nm]);
    }
}

$foo = new Setter();
$foo->1;
$foo->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)
  }
}

Sobrecarga de método

mixed __call ( string $name , array $arguments )

O método mágico __call() permite captura a invocação de métodos não existentes. Dessa forma, __call() pode ser usado para implementar tratamento de métodos definidos pelo usuário que dependem do nome do próprio método ser chamado. Isso é útil para implementações proxy, por exemplo. Os argumentos que são passados na função serão definidos como um array no parâmetro $arguments. O valor retornado do método __call() será retornado ao chamador do método.

Example#2 Exemplo de sobrecarga com __call

<?php
class Caller
{
    private 
$x = array(123);

    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.4true);
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)
}