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

时间:2009-08-24 17:13:50

标签: php php-5.3

我刚刚升级到PHP 5.3并开始为新客户端支持旧网站。它似乎使用了我之前从未遇到过的奇怪的PHP代码。

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

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

将此更改为 $ _ REQUEST ['variable_name'] 按预期工作,但由于网站规模庞大且使用专有布局方法,我无法完成所有代码并进行更改。

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

6 个答案:

答案 0 :(得分:16)

我认为这种语法没有任何新内容:

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

工作得很好; - )


你的问题可能是因为,之前,register_globals已启用(默认情况下,如果PHP< = 4.something),现在已被禁用 - 这很好为了安全!

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

例如,如果有一个像$_GET['my_var']这样的变量,您还会有一个$my_var变量......也可以使用${'my_var'}


默认情况下register_globals Off是{{1}},因为类似于PHP 4.2,并且应该在PHP 6 中消失(如果我没记错的话),我建议不要重新激活它。至少,如果你有时间来纠正/测试代码...

答案 1 :(得分:5)

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

从手册:

  

为了使用变量变量   对于数组,你必须解决一个问题   歧义问题。也就是说,如果你   写一个1然后解析器需要   知道你是否打算用$ 1作为   变量,或者如果你想要$$ a作为   变量,然后是1索引   那个变量。的语法   解决这种歧义的是:$ {$ a 1}   对于第一个案例和$ {$ a} 1   第二个。

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

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

答案 2 :(得分:3)

$ {“variable_name”}语法实际上与$ variable_name相同,只是首先计算花括号的内容。所有最新版本的PHP都支持它,甚至是beta版本。但最近版本的PHP不支持的是支持将$ _REQUEST(和其他)变量注册为全局变量。有一个启用它的设置:

register_globals = on

由于安全问题,不建议用于生产。通过一些类似'sed'的工具来运行你的源代码可能更容易,并用正则表达式替换用法。

答案 3 :(得分:2)

旧服务器可能已启用REGISTER_GLOBALS。所以奇怪的括号不是问题。

REGISTER_GLOBALS$_REQUEST中的所有变量作为常规变量放在全局范围内,这意味着您可以像访问$_REQUEST['test']$test一样访问${"test"}

默认情况下,括号语法处于启用状态,我不相信你可以打开/关闭它。

答案 4 :(得分:2)

register_globals可能已开启。 {$variable_name}语法始终处于启用状态,但register_globals会将$_REQUEST['variable_name']转换为$variable_name

如果可能的话,尽量避免打开它 - 这是一个长期被建议反对的原因,它完全在PHP6中消失。

答案 5 :(得分:0)

自php 5.3起,

register_globals已弃用,自PHP 6.0起将被删除。你想要做的是使用大多数PHP IDE(zendo studio 6+)中的重构功能将变量重命名为更合适的名称,即$_GET['variable_name']