Mostrando entradas con la etiqueta ftw. Mostrar todas las entradas
Mostrando entradas con la etiqueta ftw. Mostrar todas las entradas

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?

31.8.11

Radical, un pensamiento natural

Lo que me fascina de los lenguajes es el potencial que tienen para mejorar nuestra concepción del pensamiento mismo. Cada día me sorprendo mas.

Pero hablemos al chile (y no hablo del país), yo no soy fanático ni mucho menos obsesivo con ningún lenguaje. Solo trato de ser justo y humano, al final todo es cuestión de gusto.

Aquí es donde entra el radicalismo, no me gusta la forma tradicional de programar ni 100% objetos, ni 100% funcional. Creo que una buena combinación de ambos es perfecta para mi: PHP

Cuando observamos Javascript no parece que todo fuera un objeto, pero así lo es. Así mismo pasa con Ruby, y así cualquiera se acostumbra. Ni hablar de JAVA. No lo uso ni de keyword...

Ando tratando de llevar todo lo que he aprendido al limite, explotando todos los medios para desarrollar algo loco, la verdad solo busco mas aprendizaje y no más. Si gustan revisen mi Github

Después de todo soy scripter, ya lo verán.

10.8.11

¿Donde quedó la bolita?

Una de las cosas chidas que aprendí de jQuery es la forma en que maneja los argumentos, de forma casi predictiva. A lo que me refiero es la manera en que permite que los argumentos de la derecha se puedan emplear hacía la izquierda y así sucesivamente.

jQuery.post( url, [data,] [success(data, textStatus, jqXHR),] [dataType] )

jQuery.post('url.php', { foo: bar }, function(){}, 'json');
jQuery.post('url.php', function(){}, 'json');

O algo así, la onda es que me late hacer lo mismo con PHP.

function foo($bar = '', $candy = 0, $does = array(), $nothing = NULL, $else = FALSE)
{
  if (is_integer($bar))
  {
    $candy = $bar;
    $bar = '';
  }

  if (is_array($candy))
  {
    $does = $candy;
    $candy = 0;
  }

  if (is_callable($does))
  {
    $nothing = $does;
    $does = array();
  }

  if (is_bool($nothing))
  {
    $else = $nothing;
    $nothing = NULL;
  }
}

Aquí la clave está en conocer bien el tipo de argumentos que necesita nuestra función, y en base a ello omitir o redefinir los argumentos. En el ejemplo se hace de forma muy abusiva, confusa y complicada.

Si una función espera mas de 4 argumentos entonces lo que yo hago es agrupar las opciones mas triviales y restantes en un solo último argumento a modo de arreglo asociativo. Así los primeros tres argumentos -los mas relevantes- son mas fáciles de comparar predictivamente, suponiendo que alguno de ellos es igualmente un arreglo asociativo para combinarlo con las últimas opciones.

function request($url, $method = 'GET', array $params = array())
{
  static $defaults = array(
    'url' => '',
    'vars' => array(),
    'method' => 'GET',
    'headers' => array(),
    'status' => 200,
    'timeout' => 30,
    'callback' => 'print',
  );


  if (is_array($url))
  {
    $params += $url;
  }


  if (is_array($method))
  {
    $params += $method;
  }


  $params = array_merge($defaults, $params);

  extract($params);
}

Aquí hay otro tip: el type-hinting de php es realmente útil en estos casos, neta. Esto cambia radicalmente nuestra forma de emplear una función, método o como se llame.

Así mismo la idea es trabajar directamente con la variable de opciones, o bien, usar extract() para abreviar.

Yo le llamo patrón de predicción.

7.8.11

Consola carajo

No se de donde saque la idea pero creo que sí. Solo que no se si es legal poner una imagen en el post, me da igual. Mejor no pongo la imagen.

Bueno, la neta nunca había usado la consola de php.

Como fanático xubuntero que soy pues me late usar cualquier terminal de consola, y eventualmente cuando desarrollo ando usándola. Casi siempre.
Con PHP no me refiero a programar scripts para la consola, sino usarla para ejecutar código interactivamente.

A chinga, me dije. He pecado de pe#$&\!.

Pues ya, la primer consola interactiva que emplee fue irb de Ruby o alguna de Javascript, no me acuerdo.

En corto, primero un $ php --help | grep shell

  -a               Run as interactive shell

¡Papas!

3.8.11

Chido One

Así fue mi carnal, de una búsqueda que me llevó menos de 5 segundos de mi estúpida vida copie y pegué los códigos necesarios para jalar al blog el chingón script que usa GoogleCode, el famoso con ganas google-code-prettify (aka PrettyPrint).

No le pienso dar crédito al primer resultado que me salio hasta ver por mi mismo que funciona y todo, ¿verdad?

PHP

<?= 'Hola pinche mundo!'; ?>

Javascript

(function(){
  console.log('esta es una prueba');
})();

HTML

para <strong>resaltar</strong> el código

CSS

/* que mas a menudo */
strong {
  text-shadow: 2px 2px 2px #000;
  content: "utilizo.";
}

FTW, ¿no?

Pues eso era todo, no más queriendo comprobar su efectividad.