Interfaces de Objetos
Interacción de Objetos
Clases y Objetos (PHP 5)
PHP Manual

## Sobrecarga

Las llamadas a métodos y los accesos a los miembros pueden ser sobrecargadas por medio de los métodos __call, __get y __set. Estos métodos serán accionados cuando su objeto u objeto heredado no contengan los miembros o métodos que está intentado accesar. All overloading methods must not be defined as static.

Since PHP 5.1.0 it is also possible to overload the isset() and unset() functions via the __isset and __unset methods respectively.

### Sobrecarga de Miembros

void __set ( string `$name` , mixed `$value` )
mixed __get ( string `$name` )
bool __isset ( string `$name` )
void __unset ( string `$name` )

Los miembros de la clase pueden ser sobrecargados para ejecutar código personalizado definido en la clase al definir estos métodos de nombre especial. El parámetro $name usado es el nombre de la variable que debe ser asignada (set) u obtenida (get). El parámetro $value del método __set() especifica el valor que el objeto debe tener $value.

Example #1 Ejemplo de sobrecarga con with __get, __set, __isset y __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
// this doesn't pass through the __isset() method
// because 'n' is a public property
var_dump(isset($foo->n));
var_dump($foo);
?>`

El resultado del ejemplo seria:

    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étodos

mixed __call ( string `$name` , array `$arguments` )

Los métodos de la clase pueden ser sobrecargados para ejecutar código personalizado definido en la clase al definir este método en particular. El parámetro $value es el nombre de la función que se pidió usar. Los argumentos que fueron pasados en la función serán definidos como una matriz en el parámetro $arguments. El valor regresado del método __call() será regresado a quien haya llamado al método.

Example #2 Ejemplo de sobrecarga con __call

`<?php
class Caller
{
private $x = array(1, 2, 3);
public function __call($m, $a)
{
print "Method $m called:\n";
var_dump($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>`

El resultado del ejemplo seria:

    Method test called:
    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)
    }

Interfaces de Objetos
Interacción de Objetos
Clases y Objetos (PHP 5)
PHP Manual