7.9.11

¿Pachequés o flexo?

Disculpen el título. Nel, ni se que dije.

Bueno... aquí traigo otra de las cosas locas -y divertidas- que me laten de PHP, ya me dirán.
Trabajando un poco en un proyecto que tengo alojado en mi cuenta de GitHub quise darle la vuelta a un problema especifico: diseñar una API que fuese amigable y divertida a la vez, desde luego me refiero al lenguaje mismo y no más.

Así pues descubrí que dos conceptos pueden existir bajo el mismo nombre, y hablo en serio:

function foo()
{
}

class foo
{
}

¿Y que chingados con eso?

Pues eso, de alguna extraña forma php permite nombrar de la misma manera una función y/o clase. Esto evidentemente nos brinda la posibilidad de escribir una serie scripts de diversa índole bajo el mismo "namespace" o algo parecido.

Vamos a imaginar una librería para manejar sesiones:

session_start();

class session
{
  public static function fetch($item)
  {
    return $_SESSION[$item];
  }
  public static function assign($item, $value)
  {
    $_SESSION[$item] = $value;
  }
  public static function remove($item)
  {
    unset($_SESSION[$item]);
  }
}

function session($item, $value = NULL)
{
  if (func_num_args() === 1)
  {
    return session::fetch($item);
  }
  elseif (is_null($value))
  {
    session::remove($item);
  }
  else
  {
    session::assign($item, $value);
  }
}

En mi experiencia esto facilita las cosas de una forma sumamente agradable y consistente, si no me creen hagan la prueba.

¡Diviertanse!

3.9.11

Classy patch

Ahora que lo pienso no se si existe algo parecido a esto.

Diviertiendome pensé que sería divertido jugar con alguna otra cualidad de PHP. Hice un podo de research y no hallé al respecto así que me dedique a diseñar algo así.

// registramos el buen autoloader
spl_autoload_register(function($class)
{
  rescue($class);
});

// registramos filtros
function resolve(Closure $with = NULL)
{
  static $patch = array();


  if (func_num_args() === 0)
  {
    return $patch;
  }

  $patch []= $with;
}

// y los ejectuamos
function rescue($class)
{
 foreach (resolve() as $callback)
 {
   $callback($class);
 }
}

Si, es un sistema de autoload, sin embargo no es una convencional. Y tiene varias ventajas mas.

Pa' sonreír, ¿no?