PHP7: Sintaxis uniforme de variables

PHP 7 ya casi está aquí. Su principal cambio, es que debe funcionar, en promedio, el doble de rápido que PHP 5.x sin necesidad de modificar los programas ya hechos. Rasmus mostró unos slides en PHP Australia con unos benchmarks (con flecha derecha avanza los slides) sobre algunas aplicaciones populares, y su diferencia de velocidad. Y wao…

Esta nueva versión tiene un gran cambio que traerá problemas con el código en PHP ya existente, ahora usa una nueva sintaxis de variables que afecta cómo se evalúan las variables variables desreferenciadas.

Las variables variables son una de esas travesuras mágicas de PHP que algunos lo toman como mala práctica de programación, aunque te ayuda bastante si los usas con cautela: Una variable variable es una forma de acceder a una variable, propiedad, función, o método, usando el valor de otra variable.

$nombre = ‘oliver’;
$campo = ‘nombre’;
echo $$campo;

El código de arriba mostrará oliver. Con el tiempo, la sintaxis de PHP se volvió más compleja, y la forma de evaluar variables variables cuando se desreferencia un array comenzó a ser inconsistente. PHP normalmente analiza las expresiones de izquierda a derecha. En el código:

$arr[‘el’] -> prop;

PHP primero buscar la variable array $arr, luego busca su elemento 'el', y del objeto resultante accede a su propiedad prop.

PERO en algunas expresiones más complejas como:

$$arr[‘el’] ->; prop

PHP 5.x primero obtendrá el valor de $arr, ubicará su elemento ‘el’, y luego buscará una variable con nombre igual a dicho resultado, y de ahí accederá a su propiedad prop. Empieza a analizar por la mitad, regresa a la izquierda, y luego se va a la derecha. Y hay muchos más casos de inconsistencias de este tipo, incluso con expresiones idénticas en contextos distintos.

Adiós al desorden

En PHP7 el análisis de las variables será de izquierda a derecha, sin excepciones. Ya me topé con un problema de estos: Este línea de código empezó a generar la noticia ‘Array to string conversion‘:

$res[] = $record -> $params[0];

Quizás haya tenido un poco de sentido común esta forma de analizar variables: obtienes la propiedad cuyo nombre se guarda en el índice 0 del array $params, del objeto $record. Pero nuevamente es inconsistente con el análisis izquierda-derecha. PHP7 ahora lo analiza así: Obtiene la propiedad guardado en la variable $params del objeto $record, y de él obtiene el elemento 0. Como $params es un array, y las variables variables tienen que ser strings, produce la noticia que mencioné arriba.

Para lograr el comportamiento que quiero en PHP7, es necesario darle un hint al analizador usando llaves, para agrupar los elementos que deben ser analizados juntos:

$res[] = $record -> {$params[0]};

Este código también es válido en PHP5. Este cambio trae orden al caos, a costas de romper compatibilidad con código anterior. Pero además, este cambio prepara al analizador de PHP para poder evaluar expresiones más complejas. Ahora queda a esperar al lanzamiento final, en Octubre