繁体   English   中英

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

[英]PHP 5.3 support for strange '${}' code?

我刚刚升级到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.something) ,现在已禁用 - 这对安全性有好处!

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

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


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

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

从手册:

为了将变量变量与数组一起使用,您必须解决模糊问题。 也就是说,如果你写$$ a 1然后解析器需要知道你是否想要使用$ a 1作为变量,或者你想要将$$作为变量,然后是该变量的1索引。 解决这种歧义的语法是:第一种情况为$ {$ a 1 },第二种情况为$ {$ 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中消失。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM