Métodos mágicos __set y __get, Definición y uso con __call en PHP

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

class test{

 private $attrib = array();

 public function __call($method, $args){

  $methodType = substr($method, 0, 3);
  $attribName = substr($method, 3);

  if( $methodType == "set" ){
   $this->setAttrib($attribName, $args[0]);
  }

  if( $methodType == "get" ){
   return $this->getAttrib($attribName);
  }
 }

 private function setAttrib($attribName, $value){
  $this->attrib[$attribName] = " + $value + ";
 }

 private function getAttrib($attribName){
  return $this->attrib[$attribName];
 }
}

Para usarlos

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

This entry was posted in PHP. Bookmark the permalink.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>