PHP 5.3支持奇怪的'$ {}'代码?

Bee*_*son 2 php php-5.3

我刚刚升级到PHP 5.3并开始为新客户端支持旧网站.它似乎使用了相当奇怪的PHP代码,我之前没有遇到过.

在尝试访问$ _GET或$ _REQUEST变量时,开发人员使用了以下内容:$ {"variable_name"}

我收到由于未定义变量而生成的通知(可能是因为PHP没有解析$ {"variable_name"}样式代码).

将此更改为$ _REQUEST ['variable_name']按预期工作,但我无法完成所有代码并更改它,因为网站很大并使用专有布局方法.

有谁知道是否可以打开对这些标签/代码块的支持?我已经看过PHP.ini,并且提到了ASP样式标签和短标签但是启用它们没有任何效果(无论如何它们看起来完全不同,我只是觉得它值得一试).

Pas*_*TIN 16

我不认为这种语法有什么新东西:

$a = 10;
var_dump(${"a"});
Run Code Online (Sandbox Code Playgroud)

工作得很好;-)


您的问题可能是因为之前register_globals已启用(默认情况下,如果PHP <= 4.something),并且现在已禁用 - 这对安全性有好处!

将register_globals设置为On,任何变量$_REQUEST都会在应用程序中自动注入为vartiable - 实际上,这取决于配置选项,但这个变量几乎总是包括Get,Post和Cookie,至少.variables_order

例如,如果有一个变量$_GET['my_var'],你也会有一个$my_var变量......也可以用语法访问这个变量${'my_var'}


考虑到register_globalsOff由因为像PHP 4.2默认情况下,在PHP 6应该会消失(如果我没记错的话),我建议不要重新启动它......至少,如果你有改正/测试代码所需要的时间. ..


zom*_*bat 5

变量的Curly brace语法是PHP的嵌入式部分,并且已经存在了很长时间.它存在的原因是在使用变量变量时解决数组和对象语法的歧义.

从手册:

为了将变量变量与数组一起使用,您必须解决模糊问题.也就是说,如果你写$$ a 1,那么解析器需要知道你是否想要使用$ a 1作为变量,或者你想要将$$作为变量,然后是该变量的1个索引.解决这种歧义的语法是:第一种情况为$ {$ a 1 },第二种情况为$ {$ a} 1.

在几种情况下,这是一种非常方便的语法,例如在使用heredoc语法输出内容时使用数组或对象变量.

我不会重申其他人关于使用的建议register_globals,我只想阐述这种不寻常的语法.