题
我刚刚升级为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_globals
是 Off
默认情况下,由于诸如PHP 4.2之类的东西,应在PHP 6中消失 (如果我没记错的话), ,我建议不要重新激活它...至少,如果您有时间更正 /测试代码...
其他提示
$ {“ 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']
.