elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Métodos mágicos __set y __get, Definición y uso con __call en PHP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Métodos mágicos __set y __get, Definición y uso con __call en PHP  (Leído 3,229 veces)
Graphixx


Desconectado Desconectado

Mensajes: 1.336


Full Stack Developer


Ver Perfil WWW
Métodos mágicos __set y __get, Definición y uso con __call en PHP
« en: 13 Abril 2012, 20:24 pm »

Los métodos mágicos en php son muy utiles y altamente usados en frameworks y orms com zend o Doctrine, en este artículo espero explicar un poco de ellos y los posibles problemas que pueden tener.

Los métodos mágicos en php nos permiten llamar métodos en objetos como si exitieran aunque en realidad no existen , de esta manera podemos tener métodos, en este caso set y get, para setear o sustraer datos de atributos sin necesidad de declararlos.
Existen otros métodos como __clone, __wakeup o __construct entre los mas utilizados que nos permiten realizar tareas diversas , pero aca nos centraremos en los métodos mágicos “set” y “get”.

Los métodos mágicos de php __set y __get funcionan como habilitando atributos públicos, es decir el llamado al método se hace de la misma manera en el que se modificaria un atributo desde afuera , por ejem si deseo hacer un set a la propiedad nombre tendria que hacer

$objeto->nombre =”Lucas”;

Para obtener el valor o hacer un get simplemente hago

$valor = $objeto->nombre;

Hacer el set y el get como un atributo publico no significa que se se rompa con el encapsulamiento ya que siempre se pasa por los métodos mágicos __get y __set.

Personalmente no me agrada el tener que llamar un método set haciendo por ejem
$objeto->metodo=’algo’ ya que da la sensación de que no es un método y confunde en el código. Es por eso que haciendo algunos cambios podemos obtener el mismo efecto.
Para ello utilizaremos el método mágico __call el cual nos permite llamar mágicamente cualquier método , cuando el método que llamamos no existe se ejecuta automaticamente este método mágico call con el nombre del metodo que no existe como parametro, ahora sabiendo esto podemos hacer

$objeto->setMetodo(‘algo’);

lo que llamaria a __call con setMetodo como parametro mas los argumentos en este caso ‘algo’

si tomamos las 3 primeras letras del método que viene por parametros podemos saber si es un set o un get y proceder acorde a eso.

De esta manera nos ahorramos de tener que crear set y get para todos los atributos , pudiendo crearlos en las clases cuando necesitemos añadir una validación y no definiendolos cuando queremos tome el comportamiento estandard.

El código PHP final queda
Código
  1. class test{
  2.  
  3. private $attrib = array();
  4.  
  5. public function __call($method, $args){
  6.  
  7.  $methodType = substr($method, 0, 3);
  8.  $attribName = substr($method, 3);
  9.  
  10.  if( $methodType == "set" ){
  11.   $this->setAttrib($attribName, $args[0]);
  12.  }
  13.  
  14.  if( $methodType == "get" ){
  15.   return $this->getAttrib($attribName);
  16.  }
  17. }
  18.  
  19. private function setAttrib($attribName, $value){
  20.  $this->attrib[$attribName] = " + $value + ";
  21. }
  22.  
  23. private function getAttrib($attribName){
  24.  return $this->attrib[$attribName];
  25. }
  26. }

Para usarlos

$xx = new test();
$xx->setPrueba(“aca va algo”);
$xx->setPrueba2(“aca va algo2″);
echo $xx->getPrueba();
echo $xx->getPrueba2();

Fuente:
http://vacilmio.blogspot.com/2010/07/php-orientado-objetos-metodos-magicos.html


En línea

Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx Rōninnovation
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Métodos mágicos __set y __get, Definición y uso con __call en PHP
« Respuesta #1 en: 13 Abril 2012, 20:35 pm »

Buena info! :D


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
mejor definicion
Sugerencias y dudas sobre el Foro
locomanzo 1 2,557 Último mensaje 21 Abril 2005, 17:16 pm
por UnnamedPlayer
sobrecarga de metodos, se puede aplicar en metodos abstract o interfaces?
Desarrollo Web
jhonatanAsm 0 3,189 Último mensaje 16 Agosto 2011, 00:22 am
por jhonatanAsm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines