Temas etiquetados como: ‘oop’

Métodos mágicos en PHP5

20 Diciembre, 2009

Desarrollar en PHP5 con orientación a objetos cada vez es más parecido a desarrollar con Java, los "javeros" siempre comentan que PHP no hace más que "copiar" y la verdad es que razón no les falta ^_^ pero una de las particularidades que tiene el desarrollar con POO en PHP5 son los métodos mágicos. Los usan cada vez con más frecuencia los frameworks de desarrollo en PHP5 y es por la flexibilidad que ofrecen en los desarrollos.

Quien no ha utilizado en algún momento en PHP5 el new stdClass(), al hacer una instancia de esta clase predefinida en el core de PHP5 estamos creando una clase estándar en donde las propiedades se generan de manera dinámica.

En el ejemplo del que mostraré a continuación se trata de una clase estándar donde encapsularemos el acceso a las propiedades de la clase. Utilizaremos el la encapsulación y el principio de la ocultación en la Programación Orientada a Objetos para el desarrollo de esta clase con métodos mágicos. No exponiendo el acceso a las propiedades en ámbito público.

La clase que vamos a crear no entiende de las posibles propiedades que puede tener el objeto, ni tampoco de los valores que almacenará y menos de acciones sobre propiedades. Simplemente almacenará N valores en diferentes propiedades de manera dinámica, simulando el comportamiento de "stdClass".

PHP:
  1. /**
  2. * Clase estándar con propiedades de ámbito privado, en donde
  3. * para acceder a las propiedades es necesario invocar métodos
  4. * set/get bien para inicializar la propiedad o recuperar.
  5. *
  6. * @author mariotux
  7. * @date 20/12/2009
  8. */
  9. class MyStdClass {
  10.  
  11. private $properties;
  12.  
  13. private function __get($name) {
  14.  
  15. $name = strtolower($name);
  16. if (array_key_exists ( $name, $this->properties)) {
  17. return $this->properties [$name];
  18. }else{
  19. throw new Exception('Unknown property  '. $name);
  20. }
  21. }
  22.  
  23. private function __set($name, $value) {
  24.  
  25. $name = strtolower($name);
  26. if(count($value) == 1){
  27. $this->properties [$name] = $value[0];
  28. }else{
  29. $this->properties [$name] = $value;
  30. }
  31.  
  32. }
  33.  
  34. public function __call($name, $arguments) {
  35.  
  36. $methodType = substr($name, 0, 3);
  37. $nameMethod = substr($name,3);
  38.  
  39. switch ($methodType){
  40. case 'get':{
  41. return $this->$nameMethod;
  42. break;
  43. }
  44. case 'set':{
  45. $this->$nameMethod = $arguments;
  46. break;
  47. }
  48. default:{
  49. throw new Exception('Unknown method  '. $name);
  50. }
  51. }
  52.  
  53. }
  54.  
  55. public function __construct() {
  56. $this->properties = array ();
  57. }
  58. }

Cómo podemos observar en la clase, en cuanto se intenta invocar a un método que no sea get o set generamos una excepción, al igual que también lo hacemos cuando se intenta acceder a una propiedad que no ha sido inicializada al invocar el método get de la propiedad. En el set no realizamos la comprobación ,ya que al estar asignando un valor a una propiedad siempre la trataremos como una propiedad nueva en caso de que no exista.

Este es un ejemplo de como utilizar métodos mágicos, en donde sólo estamos utilizando __construct, __call, __set, __get pero existen más métodos mágicos que podríamos utilizar para extender el comportamiento de la clase.