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.