Plug-ins para PHP

Para que el se ha encontrado con que quiere poder extender sus aplicaciones de PHP mediante plug-ins, aquí hay una idea muy simple de como se puede hacer.

Supongamos que tenemos un archivo llamado external_dateFormat.php que continue únicamente una función:

<?php
  1. function external_dateFormat($string, $include_time = false, $date_format = 'd/m/Y', $time_format = 'H:i:s')
  2.  {
  3.   if($include_time)
  4.    {
  5.     $format = $date_format.' '.$time_format;
  6.     return date($format, strtotime($string));
  7.    }
  8.   else
  9.    return date($date_format, strtotime($string));
  10.  }
  11. ?>

Básicamente recibe unos parámetros y devuelve una fecha según el formato que reciba o el pre-determinado.

Ahora bien; por otro lado tenemos una clase en donde tenemos algunas funciones y queremos llamar a esta función dateFormat() solo en un momento dato y bajo ciertas circumstancias, como si se tratase de un plug-in por ejemplo.

A continuación la clase:

<?php
  1.  
  2. class isample {
  3.  
  4.   // Aquí guardamos la sobrecarga de variables. Esto se puede omitir, pero si llegamos
  5.   // a tener estructuras de arrays muy complejas PHP se pierde.
  6.   private $_s_g = array();
  7.  
  8.   // Cuando se trata de acceder (almacenar) una variable que no existe se invoca a este
  9.   // método que la guardará en el array anterior.
  10.   // $name es el nombre de la variable que queremos escribir
  11.   // $value el valor que tendrá
  12.   function __set($name, $value)
  13.    {
  14.     $this->_s_g[$name] = $value;
  15.    }
  16.  
  17.   // Cuando se trata de acceder (leer) una variable que no existe se invoca a este
  18.   // método que la obtendrá del array anterior.
  19.   // $name es el nombre de la variable de la cual queremos saber su valor
  20.   function __get($name)
  21.    {
  22.     return $this->_s_g[$name];
  23.    }
  24.  
  25.   // Cuando se trata de acceder a un método que no existe en esta clase se invoca
  26.   // método (mágico) que permite extender la llamada a otra funcíon o, en este caso,
  27.   // cargar nuestro "plug-in" del archivo externo.
  28.   // $name es el nombre del método al que queremos acceder
  29.   // $args son los argumentos que le pasaríamos
  30.   function __call($name, $args)
  31.    {
  32.     // Incluímos (solo una vez) el archivo con nuestra función
  33.     require_once('external_'.$name.'.php');
  34.  
  35.     // A la variable fecha (que no está ligada al objecto) le asignamos el resultado de nuestra función.
  36.     // Llamamos a nuestra función y le pasamos los parámetros recibidos desde la llamada
  37.     $this->fecha = call_user_func_array('external_'.$name, $args);
  38.    }
  39. }
  40.  
  41. $str = '2008-01-12 14:43:21';
  42. $t = new isample(); // Creamos una nueva instacia del objeto
  43.  
  44. // Llamamos al método dateFormat que no existe en este objecto
  45. $t->dateFormat($str, true, 'D d, M / Y');
  46.  
  47. // Mostramos el valor de la variable fecha (que solo existe mágicamente en el objeto)
  48. echo $t->fecha;
  49.  
  50. ?>

Y con este pequeño ejemplo se pueden implementar modelos más complejos de plug-in. Se puede, por ejemplo, utilizar ob_start(); y crear un potente y rápido sistema de cache para las funciones incluidas, pero eso ya es otra historia.

Espero que les sea de ayuda.