Get y Set «mágicos» en PHP5

Este POST sólo puede interesar a programadores.
Cuando programo, me gusta hacer código limpio, y a veces, escribo muchas líneas de código que luego no uso. Esto, aunque me haga perder tiempo al principio siempre me facilita el trabajo de después, lo tomo como una inversión. Por ejemplo, si tengo una clase «noticia», relacionada con una BBDD, de primeras le creo tantos atributos como campos tiene la tabla de la BBDD, y además los métodos guardar, borrar, modificar, buscar, dibujar etc. Pero además de esto, para hacerlo limpio, hasta ahora siempre me creaba por cada atributo, un metodo get y otro set.

class noticia {
  public $id;
  public $nombre;
  public function get_id() {
    return $this->id;
  }
  public function set_id($id) {
    $this->id = $id;
  }
  public function get_nombre() {
    return $this->nombre;
  }
  public function set_nombre($nombre) {
    $this->nombre = $nombre;
  }
  [...]
}

Esto, cuando tienes muchos atributos ( =campos en la tabla), se hace un poco tedioso y absurdo.
Hoy, leyendo la documentación de PHP5, me he dado cuenta que existe un método mágico (la sobrecarga) para no tener que hacer eso así. A ver si lo puedo explicar con un ejemplo:

class noticia {
  private $id;
  private $nombre;

  public function dame_nombre() {
  //   return $this->nombre;
    return $this->__get('nombre');
  }

  private function __get($atrb) {
    switch ($atrb) {
      case '':
          return '';
      case 'nombre':
          return 'Nombre: '.$this->nombre;
      default:
        return $this->$atrb;
    }
  }

  private function __set($atrb, $val) {
    switch ($atrb) {
      case '':
          return '';
      default:
        $this->$atrb = $val;
    }
  }

  private function __isset($atrb) {
    return isset($atrb);
  }

  private function __unset($atrb) {
    unset($this->$atrb);
  }

}

De esta manera, cada vez que accedemos desde fuera de la clase a los atributos «id» o «nombre», pasarán por las funciones especiales __get o __set dependiendo de si estamos leyendolo o escribiéndolo. Y podemos poner todos los atributos que queramos sin tener que escribir nuevas funciones get y set para cada uno.
Esto me va a ahorrar mucho tiempo de ahora en adelante… 🙂

OJO: si accedemos desde dentro de la clase al atributo directamente, no pasará por la función mágica, pero podemos forzarlo haciendo $this->__get(‘nombre’);


Publicado

en

, ,

por

Comentarios

4 respuestas a «Get y Set «mágicos» en PHP5»

  1. Avatar de victor
    victor

    Hola

  2. Avatar de hector

    me has abierto los ojos buscaba algo como un «petrolero» (creo que asi le llaman) y llegue a este
    muchas gracias

  3. Avatar de carlos

    Lo más interesante de todo es que si haces un array puedes almacenar propiedades que la clase no tiene por si misma. Pongo un ejemplo,

    private medio = new array();
    //metodo set impotante
    public function __set($propiedad, $valor)
    $this->medio[$propiedad] = valor;

    $nuevaNoticia = new Noticia();

    //al no esistir esta propiedad el metodo set lo mete en el array
    $nuevaNoticia->unaPropiedadNoEsistente = array(‘tv’,’periodico’,internet’);

    luego solo es mostrarlo. Como podeis imaginar, poder añadir a un objeto propiedades que no estan en la clase da muchas oportunidades.

  4. Avatar de carlos

    SInceramente, me parece que no has entendido el uso de __get y __set. Lo que tu has escrito se puede hacer con cualquier metodo propio

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.