Sintaxis variable uniforme en PHP 7

La nueva sintaxis variable es probablemente una de las características más impactantes de la versión PHP 7. Aporta un mayor orden a la desreferenciación variable. La parte impactante, sin embargo, no solo afecta los cambios para mejor, sino que también introduce ciertas interrupciones de compatibilidad con versiones anteriores (BC). Entre las principales razones de estos cambios estaban las inconsistencias con la sintaxis variable variable.

Al observar la expresión $foo[‘bar’]->baz, primero se obtiene una variable llamada $foo, luego se toma el desplazamiento de la barra del resultado y, finalmente, se accede a la propiedad baz. Así es como se interpretan normalmente los accesos variables, de izquierda a derecha. Sin embargo, la sintaxis variable variable va en contra de este principio. Observando la variable $$foo[‘baz’], primero se recupera $foo, luego se compensa su baz, y finalmente se busca la variable con el nombre del resultado.

La sintaxis variable uniforme recientemente introducida aborda estas inconsistencias según el siguiente ejemplo:

/*** expression syntax ***/

$$foo['bar']['baz']
// PHP 5.x meaning
${$foo['bar']['baz']}

// PHP 7.x meaning
($$foo)['bar']['baz']
/*** expression syntax ***/
$foo->$bar['baz']

// PHP 5.x meaning
$foo->{$bar['baz']}

// PHP 7.x meaning
($foo->$bar)['baz']
/*** expression syntax ***/
$foo->$bar['baz']()

// PHP 5.x meaning
$foo->{$bar['baz']}()

// PHP 7.x meaning
($foo->$bar)['baz']()
/*** expression syntax ***/
Foo::$bar['baz']()

// PHP 5.x meaning
Foo::{$bar['baz']}()

// PHP 7.x meaning
(Foo::$bar)['baz']()

Además de abordar las inconsistencias anteriores, se han agregado varias nuevas combinaciones de sintaxis que hacen que las siguientes expresiones sean ahora válidas:

$foo()['bar']();
[$obj1, $obj2][0]->prop;
getStr(){0}
$foo['bar']::$baz;
$foo::$bar::$baz;
$foo->bar()::baz()
// Assuming extension that implements actual toLower behavior
"PHP"->toLower();
[$obj, 'method']();
'Foo'::$bar;

Hay bastantes sintaxis diferentes aquí. Si bien algo de esto puede parecer abrumador y difícil de usar, abre una puerta para nuevas formas de pensar y usar el código.

Comparte