Pregunta

Acabo de actualizar a PHP 5.3 y comencé a admitir un sitio web antiguo para un nuevo cliente. Parece usar un código PHP bastante extraño que no he encontrado antes.

Mientras intenta acceder a las variables $ _get o $ _Request, el desarrollador ha utilizado lo siguiente: $ {"variable_name"}

Recibo avisos generados debido a variables indefinidas (presumiblemente porque PHP no está analizando el $ {"variable_name"} código de estilo).

Cambiando esto a $ _Request ['variable_name' Funciona como se esperaba, pero no puedo pasar por todo su código y cambiarlo, ya que el sitio es masivo y utiliza métodos de diseño de propiedad.

¿Alguien sabe si es posible encender el soporte de estas etiquetas / codeblocks? He echado un vistazo en php.ini y se menciona las etiquetas de estilo ASP y las etiquetas cortas, pero habilitando estos no tiene efecto (de todos modos se ven totalmente diferentes, pensé que valía la pena una oportunidad).

¿Fue útil?

Solución

No creo que haya nada nuevo con esa sintaxis:

$a = 10;
var_dump(${"a"});

Funciona bien ;-)


Tu problema probablemente se deba al hecho de que, antes, register_globals fue habilitado (Por defecto, si php <= 4.something), y ahora está discapacitado, ¡y eso es bueno para la seguridad!

Con registro_globals establecido en ON, cualquier variable en $_REQUEST se inyecta automáticamente como vartiable en su aplicación - Bueno, en realidad, esto depende del variables_order Opción de configuración, pero esta casi siempre incluye Get, Post y Cookie, al menos.

Por ejemplo, si hay una variable como $_GET['my_var'], también tendrás un $my_var variable ... y esta también se puede acceder a esta con la sintaxis ${'my_var'}


Considerando register_globals es Off Por defecto, ya que algo así como PHP 4.2, y debería desaparecer en Php 6 (si recuerdo correctamente), Aconsejaría que no lo reactiven ... al menos, si tiene el tiempo requerido para corregir / probar el código ...

Otros consejos

La sintaxis de la abrazadera rizada para las variables es una parte incrustada de PHP, y ha existido por bastante tiempo. La razón por la que existe es resolver ambigüedades con matrices y sintaxis de objetos cuando se usa variables variables.

Del manual:

Para usar variables variables con matrices, debe resolver un problema de ambigüedad. Es decir, si escribes $$ A1 entonces el analizador debe saber si quise usar $ A1 Como variable, o si quería $$ A como la variable y luego la 1 índice de esa variable. La sintaxis para resolver esta ambigüedad es: $ {$ a1} para el primer caso y $ {$ a}1 para el segundo.

Es una sintaxis muy útil en varias situaciones, como el uso de variables de matriz u objeto mientras se genera algo usando Sintaxis HEREDOC.

No reiteraré el consejo de otros sobre el uso register_globals, Solo quería exponer en esta sintaxis inusual.

La sintaxis $ {"variable_name"} es prácticamente la misma que $ variable_name, excepto que los contenidos de los aparatos rizados se evalúan primero. Está respaldado por todas las versiones recientes de PHP, incluso las versiones beta. Sin embargo, lo que no es compatible con las versiones recientes de PHP es el soporte de registrar variables $ _request (y otras) como variables globales. Hay una configuración para habilitarlo:

register_globals = on

Sin embargo, no se recomienda para el uso de la producción debido a problemas de seguridad. Puede ser más fácil ejecutar su fuente a través de una herramienta tipo 'Sed' y reemplazar los usos con expresión regular.

El servidor antiguo probablemente tiene REGISTER_GLOBALS en. Entonces, los corchetes extraños no son el problema.

REGISTER_GLOBALS pone todas las variables en $_REQUEST Como variables regulares en el alcance global, lo que significa que puede acceder $_REQUEST['test'] se puede acceder como como $test o ${"test"}

La sintaxis del soporte está activada de forma predeterminada, y no creo que pueda encenderla/desactivarla.

register_globals probablemente se encendió. {$variable_name} La sintaxis siempre está encendida, pero register_globals Vuelve cosas como $_REQUEST['variable_name'] dentro $variable_name.

Sin embargo, evite encenderlo si es posible: hay una razón por la que se le ha aconsejado durante mucho tiempo, y está desapareciendo por completo en PHP6.

register_globals está en desuso a partir de Php 5.3 y se eliminará a partir de Php 6.0. Lo que desea hacer es utilizar la función de refactorización que se encuentra en la mayoría de los PHP IDE (Zendo Studio 6+) para cambiar el nombre de la variable a algo más apropiado, es decir, $_GET['variable_name'].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top