在变量(PHP)中使用$\u服务器时出错
我试图通过get参数获取超全局变量的名称。我被告知在get请求中只传递在变量(PHP)中使用$\u服务器时出错,php,superglobals,Php,Superglobals,我试图通过get参数获取超全局变量的名称。我被告知在get请求中只传递\u VAR\u NAME(不传递$),因此在程序中,我必须通过变量访问它:$\u get['parameter\u NAME'] 除了使用$\u服务器,一切都很顺利。为了尝试出错的地方,我只做了一个小的php脚本来测试发生了什么。代码如下: <?php // ¡¡ This does not work !! $nombre = "_SERVER"; $var = $$nombre
\u VAR\u NAME
(不传递$
),因此在程序中,我必须通过变量访问它:$\u get['parameter\u NAME']
除了使用$\u服务器
,一切都很顺利。为了尝试出错的地方,我只做了一个小的php脚本来测试发生了什么。代码如下:
<?php
// ¡¡ This does not work !!
$nombre = "_SERVER";
$var = $$nombre;
print_r($var);
// This works
$nombre = "_GET";
$var = $$nombre;
print_r($var);
?>
\u服务器
版本不工作有什么原因吗?
我得到以下错误:
注意:未定义的变量:\u服务器
在
我不知道你为什么需要这个,我不使用变量(通常有更好的方法) 你可以根据$nombre变量做一个简单的切换,没有那么多超全局变量
switch ($nombre) {
case "_SERVER" :
print_r($_SERVER);
break;
case "_GET" :
print_r($_GET);
break;
case "_POST" :
print_r($_POST);
break;
// ...
default:
echo "Unknown variable";
}
它在这里非常适合我。你试过打印吗 ($\u服务器) 可能没有在您的系统上填充它 确保没有在脚本中的某个位置取消设置它
您是在函数或类中使用它吗 警告指出,这不能用于函数或类中的超全局函数
最佳选择是switch语句。您可以尝试其他语法:
$var = $GLOBALS["_SERVER"];
print_r($var);
这在功能上等同于$$varvar
需要检查的另一个关键问题是$\u服务器本身是否存在。(如果不是,请在脚本开头放置一个空的计数($\u SERVER);
表达式。)
如果在php.ini
中修改了它,则它可能不存在(尽管在最近的php版本中它实际上应该显示为空数组)。当启用auto\u globals\u jit
指令时,服务器和ENV变量将在首次使用时(及时)而不是在脚本启动时创建。关于变量的警告:
在编译时检查服务器和环境变量的使用情况
因此,通过变量使用它们不会导致
初始化
可能的解决办法是:
- 使用PHP函数
getenv()
而不是服务器变量
- 仅添加行
$\u服务器代码>在脚本开始之前或之前
- 禁用指令(在php.ini中:
auto\u globals\u jit=Off
,或在脚本中:ini\u set('auto\u globals\u jit',0);
)
- 使用数组$GLOBALS中的键“\u SERVER”(
$GLOBALS[''u SERVER']
)
您确定建议是使超全局引用?这似乎很奇怪。通常情况下,您最多只能使用数组索引。您有哪个php版本?是否正在cli上运行?建议:在codephpinfo()报告中始终使用英语:PHP版本5.3.3-1ubuntu9.3服务器中出现了一些问题,因为我可以在其他服务器上运行脚本,不会有问题。我将与服务器管理员联系。我刚刚在脚本末尾添加了您的代码行,这使代码正常工作。我还尝试了Mario的增加计数的技巧($\u服务器),它也很有效。因此,变量似乎未设置。我自己也没有解开,也不明白这个问题。可能会发生什么?它不在任何函数或类中。我已经在另一台服务器上试过了,它可以正常工作,所以这似乎和服务器配置有关。啊,好的,那个么服务器是特定的。祝你好运。我建议您尝试切换superglobals,并将默认情况设置为对其他变量使用变量变量。为什么添加对$\u服务器的任何直接引用(count($\u SERVER
)例如)会使代码开始正常工作?@DavidCasillas:注意,当然可以,但我已经读到superglobals有时会在第一次访问时初始化(取决于SAPI)——但我认为您的实际问题可能是您在本地范围内尝试了$$SERVER
。超全局($\u SERVER
)不是真正的超全局,而是隐式全局。$$varvar
不引用真正的$\u服务器
,而仅引用一个本地数组(如果它以前未被显式访问)。简言之,$$SERVER
varvar只在全局范围内工作。无论如何,请使用$GLOBALS[\u serv]
为了安全起见。好的,谢谢你的建议。但对我来说,试图弄清哪里出了问题并了解php的内部结构也很重要。不仅仅是找到一个新的解决方法。@David Casillas,我不确定你的示例中的变量出了什么问题。但是如果你想在php中做得更好,使用变量不是办法代码变得更难阅读和调试,有时容易出现安全风险。仅仅因为php有这种功能并不意味着它是好的。但这只是我的拙见,请使用适合您的工具;)