Acceder a los atributos de una clase

En programación orientada a objetos siempre se ha recomendado no acceder de forma pública a los atributos de una clase. Lo lógico es definir atributos privados o protegidos (heredables pero no visibles fuera de la clase) Por consiguiente necesitamos crearnos una serie de métodos públicos que nos permitan modificar u obtener los valores de esos atributos. Estos métodos se suelen llamar accesores (getters) y mutadores (setters). Por ejemplo, para una clase Usuario, que tendrá DNI, Nombre, edad, etc. Tendremos 6 métodos: getDNI(), setDNI(valor), getNombre(), setNombre(), etc...

Por ejemplo podrían tener ese código en PHP:

<?php
   class Persona {
      protected $dni;
      protected $nombre;
      public function __construct($dni, $nombre) {
         $this->dni = $dni;
         $this->nomre = $nombre;
      }
      public function getDNI() {
         return $this->dni;
      }
      public function setDNI($valor) {
         $this->dni = $valor;
      }
      public function getNombre() {
         return $this->nombre;
      }
      public function setNombre($valor) {
         $this->nombre = $valor;
      }
   }
   $pepe = new Persona("12345678", "Pepe Pérez");
   //echo $pepe->dni; //ERROR FATAL
   echo $pepe->getNombre();
   $pepe->setDNI(&#x2018;987654321&#x2019;);
?>

PHP 5 nos ofrece la posibilidad de definir propiedades en las clases, aunque de una forma más limitada a como lo hace Java o C#.

Ya hemos visto que PHP5 incorpora modificadores de acceso para los atributos En versiones anteriores a la 5, el modificar de acceso era public pero actualmente se han definido tres modificadores como vimos en la sesión de introducción a la programación orientada a objetos. Además disponemos de una serie de métodos mágicos, como son ** __construct()**,**__destruct()**,**__toString()**, etc. Otro de los métodos mágicos incorporados por PHP para la versión 5 han sido los métodos **__get()** y **__set()**

Utilizaremos la denominada sobrecarga de datos miembro, a través de la implementación de los métodos:

  • void __set ( string name, mixed value )

  • mixed __get ( mixed name )

En ambos casos **name** es el nombre de la propiedad y **value** el valor asignado.

Esta sería la nueva clase Persona usando los métodos mágicos __set() y __get():

<?php
   class Persona {
      protected $dni;
      protected $nombre;
      public function __construct($dni, $nombre) {
         $this->dni = $dni;
         $this->nomre = $nombre;
      }
      function __get($param) {
         return $this->$param;
      }
      function __set($param, $value){
         $this->$param = $value;
      }
   }
   $obj = new Persona("12345678A", "Pepe Pérez");
   //Llamada implícita a $obj->__set($param="dni",$value="99884466B")
   $obj->dni="99884466B";
   //Sí funciona porque hacemos una llamada implícita a $obj->__get($param="dni")
   echo $obj->dni;
   echo $obj->nombre;
?>

Con un solo punto de acceso, podemos implementar elementos de comprobación para asegurarnos de que sólo se almacenan datos persistentes.

Si por alguna razón, optamos por cambiar la forma en que se almacena un atributo en cuestión, las funciones de descripción de acceso nos permitirán hacerlo variando el código en un solo punto. Por ejemplo, recuperar valor de BD, calcular un valor, codificarlo, etc.

Ejemplo del método **__set()** donde establecemos una serie de requerimientos que tienen que cumplir los atributos dni y edad:

public function __set($param, $value)
{
   switch ($param):
   {
      case 'edad':
         if (intval($value) >= 0 && intval($value) <= 120)
            $this->$param = $value; //o $this->edad = $value
         break;
      case 'dni':
         if ($this->esCorrectoDNI($value))
            $this->dni = $value; //o $this->$param = $value
         break;
      default:
         die("$param no permitido");
   }
}

results matching ""

    No results matching ""