Ver Mensaje Individual
  #28 (permalink)  
Antiguo 12/01/2005, 09:08
Avatar de Calisco
Calisco
 
Fecha de Ingreso: marzo-2004
Ubicación: Neuquen
Mensajes: 732
Antigüedad: 20 años, 9 meses
Puntos: 4
Sobrecarga

Sobrecarga
Tanto las llamados a un metodo como el acceso a las propiedades pueden ser sobrecargadas por los metodos __call, __get y __set. Estos metodos solo seran disparados cuando el objeto u objeto heredado no contenga la propiedad o el metodo al cual se esta intentando acceder.
Both method calls and member accesses can be overloaded via the __call, __get and __set methods. These methods will only be triggered when your object or inherited object doesn't contain the member or method you're trying to access.

Sobrecargando Propiedades
Código PHP:
void __set (string nombremixed valor)
mixed __get (mixed nombre
Las porpiedades de la clase pueden ser sobrecargadas al ejecutar el codigo especifico definido en su clase mediante la definicion de metodos especialmente nombrados. El parametro $nombre es usado con el nombre de la variable que deberia ser seteada o devuelta. EL parametro $valor del metodo __set() especifica el valor que el objeto deberia setear en ...
Class members can be overloaded to run custom code defined in your class by defining these specially named methods. The $name parameter used is the name of the variable that should be set or retrieved. The __set() method's $value parameter specifies the value that the object should set set the $name.



Ejemplo 19-18. Ejemplo de Sobrecarga con __get y __set

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

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

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

   function 
__set($nm$val)
   {
       print 
"Seteando [$nm] to $val\n";

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

$foo = new Setter();
$foo->1;
$foo->100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>
El resultado sera:
Cita:
Setting [a] to 100
OK!
Tomando[a]
Devolviendo: 100
Seteando [a] to 101
OK!
Tomando [z]
Nada!
Seteando [z] to 1
No OK!
object(Setter)#1 (2) {
["n"]=>
int(1)
["x:private"]=>
array(3) {
["a"]=>
int(101)
["b"]=>
int(2)
["c"]=>
int(3)
}
}
Sobrecargando Metodos
Código PHP:
mixed __call (string nombre, array argumentos
Los Metodos pueden ser sobrecargados al ejecutar el codigo especifico definido en la clase mediante la definicion de metodos especialmente nombrados. El parametro $nombre es usado con el mismo nombre de la funcion que fue solicitada para ser usada. Los argumentos que fueron pasados en la funcion seran definidos como un array en el parametro $argumentos. El valor devuelto desde el metodo __call() sera devuelto en la llamada del metodo solicitado.
Class methods can be overloaded to run custom code defined in your class by defining this specially named method. The $name parameter used is the name as the function name that was requested to be used. The arguments that were passed in the function will be defined as an array in the $arguments parameter. The value returned from the __call() method will be returned to the caller of the method.


Ejemplo 19-19. Ejemplo de Sobrecarga con __call
Código PHP:
<?php
class Caller
{
   private 
$x = array(123);

   function 
__call($m$a)
   {
       print 
"Metodo llamado $m:\n";
       
var_dump($a);
       return 
$this->x;
   }
}

$foo = new Caller();
$a $foo->test(1"2"3.4true);
var_dump($a);
?>

El resultado sera:
Cita:
Metodo llamado test:
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)
}
__________________
| Cabeza De Raton |

Última edición por Calisco; 12/01/2005 a las 10:25