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
class test{ public function __call($method, $args){ 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();
Fuente:
http://vacilmio.blogspot.com/2010/07/php-orientado-objetos-metodos-magicos.html