Programatik

October 29, 2007

Ejemplo de uso de eval() y objetos en PHP

Filed under: OOP, php — Rafa @ 7:30 pm

Supongamos una clase que gestiona productos con tres características fundamentales: ID, Nombre y Color.

Podemos escribir esta clase de la siguiente forma:

Class Product {
	private $id;
	private $name;
	private $colour;
 
	public function Product($id, $name, $colour) {
		$this->id = $id;
		$this->name = $name;
		$this->colour = $colour;
	}
}

Como se puede ver, el constructor recibe los detalles del producto y carga las propiedades con sus valores correspondientes.

Supongamos ahora que queremos obtener el valor de una propiedad dada del producto cargado. Con tres propiedades es sencillo, pues podríamos hacer métodos del tipo getName(), getID(), etcétera. Sin embargo, para un gran número de propiedades puede ser útil disponer de un método getProperty($name) por el cual obtendremos el valor de la propiedad indicada por el argumento $name.

Para estos casos es muy útil disponer del uso de la función eval(). De esta forma, la clase anterior se extenderá a la forma siguiente:

Class Product {
	private $id;
	private $name;
	private $colour;
 
	public function Product($id, $name, $colour) {
		$this->id = $id;
		$this->name = $name;
		$this->colour = $colour;
	}
 
	public function getProperty($name) {
		return eval("\$this->$name;");
	}
}

Nótese cómo en el cuerpo de eval colocamos una barra invertida para escapar el símbolo del dólar ($) en $this con el fin de que $this no se evalúe antes de tiempo, sino que forme parte del conjunto de la cadena a evaluar.

Un ejemplo de uso sería el siguiente:

$p =& new Product(1, "sacacorchos", "plateado");
echo $p->getProperty('Colour');

que daría como resultado “plateado”.

Enlaces

  • http://es.php.net/manual/es/function.eval.php
  • 2 Comments »

    1. No seria mas sencillo simplemente lo siguiente?

      public function getProperty($name) {
      return $this->$name;
      }

      Comment by NabLa — November 22, 2007 @ 11:23 am

    2. En ocasiones se puede, y merece, sustituir eval por $$.
      Por otra parte, aunque queda claro que lo de getProperty es un ejemplo para explicar las bondades de eval. Por si alguien no lo sabía, para php5, hay un método nativo que hacen la misma función que getProperty de Rafa y es __get( Más info en: http://es2.php.net/manual/es/language.oop5.overloading.php )

      Comment by CeltaProscrito — November 29, 2007 @ 12:49 pm

    RSS feed for comments on this post. TrackBack URL

    Leave a comment

    *
    To prove that you're not a bot, enter this code
    Anti-Spam Image

    Powered by WordPress