2

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

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

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

将其更改为$_REQUEST['variable_name']可以按预期工作,但是由于站点很大并且使用专有布局方法,因此我无法查看他们的所有代码并进行更改。

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

4

6 回答 6

16

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

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

工作得很好;-)


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

将 register_globals 设置为 On 时,任何变量 in$_REQUEST都会作为变量自动注入到您的应用程序中——嗯,实际上,这取决于variables_order配置选项,但这个选项几乎总是至少包含 Get、Post 和 Cookie。

例如,如果有一个$_GET['my_var']变量$my_var${'my_var'}


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

于 2009-08-24T17:17:57.033 回答
5

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

从手册:

为了在数组中使用可变变量,您必须解决歧义问题。也就是说,如果您编写 $$a 1,那么解析器需要知道您是否打算使用 $a 1作为变量,或者您是否希望 $$a 作为变量,然后是该变量的1索引。解决这种歧义的语法是: ${$a 1 } 用于第一种情况, ${$a} 1用于第二种情况。

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

我不会重复其他人关于 using 的建议register_globals,我只是想解释一下这种不寻常的语法。

于 2009-08-24T17:28:57.917 回答
3

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

register_globals = on

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

于 2009-08-24T17:19:12.680 回答
2

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

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

括号语法默认是打开的,我不相信你可以打开/关闭它。

于 2009-08-24T17:17:35.663 回答
2

register_globals很可能已打开。{$variable_name}语法总是打开的,但register_globals会将类似的东西$_REQUEST['variable_name']变成$variable_name.

不过,如果可能的话,请尽量避免打开它 - 长期以来一直不建议这样做是有原因的,并且它在 PHP6 中完全消失了。

于 2009-08-24T17:17:45.397 回答
0

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

于 2009-08-24T21:45:25.967 回答