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

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

我收到由于不确定变量而产生的通知(大概是因为PHP没有解析 $ {“ variable_name”} 样式代码)。

将其更改为 $ _request ['variable_name' 如预期的那样,但是我不能仔细研究它们的所有代码并将其更改,因为该站点很大,并且使用专有布局方法。

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

有帮助吗?

解决方案

我认为该语法没有什么新鲜事物:

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

工作正好;-)


您的问题可能是由于以下事实: register_globals 已启用 (默认情况下,如果php <= 4。, ,现在被禁用 - 这对安全有好处!

将寄存器_globals设置为ON,任何变量in $_REQUEST 在您的应用程序中自动注射为可vart - 嗯,实际上,这取决于 variables_order 配置选项,但至少它几乎总是包含get,post和cookie。

例如,如果有一个变量 $_GET['my_var'], ,您还将有一个 $my_var 可变...也可以使用语法访问此方法 ${'my_var'}


考虑 register_globalsOff 默认情况下,由于诸如PHP 4.2之类的东西,应在PHP 6中消失 (如果我没记错的话), ,我建议不要重新激活它...至少,如果您有时间更正 /测试代码...

其他提示

变量的卷曲支撑语法是PHP的嵌入部分,并且已经存在了一段时间。其存在的原因是在使用时用数组和对象语法解决歧义 变量.

从手册中:

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

在多种情况下,这是一个非常方便的语法 Heredoc语法.

我不会重申别人的建议 register_globals, ,我只是想阐述这种不寻常的语法。

$ {“ variable_name”}语法实际上与$ variable_name相同,只是首先评估了卷曲括号的内容。它得到了所有最近版本的PHP,甚至是Beta版本的支持。最新版本的PHP不支持的是将$ _request(和其他)变量作为全局变量的支持。有一个启用它的设置:

register_globals = on

不建议由于安全问题而用于生产使用。通过一些类似“ SED”的工具并用正则表达式替换使用情况可能会更容易。

旧服务器可能有 REGISTER_GLOBALS 上。因此,怪异的括号不是问题。

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

默认情况下,括号语法将打开,我不相信您可以打开/关闭它。

register_globals 可能被打开了。 {$variable_name} 语法始终在启动,但是 register_globals 转过身 $_REQUEST['variable_name'] 进入 $variable_name.

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

register_globals 截至5.3 php 5.3,将被弃用,并将从php 6.0删除。您想做的是使用大多数PHP IDE(Zendo Studio 6+)中发现的重构功能将变量重命名为更合适的东西,即 $_GET['variable_name'].

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top