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.
void
__set ( string name, mixed value )
mixed
__get ( mixed 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()
especificael calor que el objeto debe tener $value.
Ejemplo 19-18. Ejemplo de sobrecarga con with __get y __set
<?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3);
function __get($nm) { print "Getting [$nm]\n";
if (isset($this->x[$nm])) { $r = $this->x[$nm]; print "Returning: $r\n"; return $r; } else { echo "Nothing!\n"; } }
function __set($nm, $val) { print "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) { $this->x[$nm] = $val; echo "OK!\n"; } else { echo "Not OK!\n"; } } }
$foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++; 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! object(Setter)#1 (2) { ["n"]=> int(1) ["x:private"]=> array(3) { ["a"]=> int(101) ["b"]=> int(2) ["c"]=> int(3) } }
|
|
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.
Ejemplo 19-19. Ejemplo de sobrecarga con __call
<?php class Caller { private $x = array(1, 2, 3);
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) }
|
|