Google Web

7 oct. 2008

Cuando ignoras detalles triviales..

Cuando uno toma un lenguaje con algo de años en el mercado, piensa que no debe lidiar con detalles triviales como los arrays. PHP, en este punto, es la excepción. Con un inimaginable control de arreglos horrible. Hoy perdía mi tiempo en una librería en PHP para el cliente, al más puro MVC. Pero el Controller no me ejecutaba las acciones, a simple vista el único cambio en este modelo era que la acción estaba corriendo de un control aislado, fuera de la forma.

El Controller trabaja de forma sencilla y rápida, navegando el modelo y encontrando cual control tiene activada la bandera de ejecución, siempre y cuando el control no este en una lista de arreglos. Asi que tenemos un codigo algo asi:

$ignoreList=array(...);

while (list($key, $value) = each($definedVars)) {
$ignoreItem = in_array($key, $ignoreList);
if ($ignoreItem) continue;
...
if (is_array($value)){
estamismafuncion($value);
}
}

Como ven algo, que debería funcionar... si, siempre y cuando no se te ocurra buscar un Cero (0) con la función in_array(), porque siempre existe! Asi que cuando la recursión, buscaba en un arreglo (que es la mayoría de los casos, dado que es un árbol de controles) el primer elemento lo ignoraba, aun cuando la $ignoreList no tuviera un zero!.

Esto se debe que toda lista de PHP tiene un NULL de elemento final por cuestiones de punteros, y 0 == NULL en las funciones como in_array. Así que la única forma humana de corregirlo fue:

$ignoreItem = in_array("" . $key, $ignoreList);

Gracias PHP por hacer mi vida miserable!

PD. Este mismo bug del zero == null me paso con un Iterator que hice en PHP, luego les contare.