最近一直在审查PHP中的类如何工作。我偶然发现了这段代码,我试图理解为什么WAMP会给我通知而不是我的主机。
$settings['ip_forwarded_check'] = 1;
function get_ip()
{
$ip = 0;
if(!preg_match("#^(10|172\.16|192\.168)\.#", $_SERVER['REMOTE_ADDR']))
{
$ip = $_SERVER['REMOTE_ADDR'];
}
if($settings['ip_forwarded_check'])
{
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#s", $_SERVER['HTTP_X_FORWARDED_FOR'], $addresses);
}
elseif(isset($_SERVER['HTTP_X_REAL_IP']))
{
preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#s", $_SERVER['HTTP_X_REAL_IP'], $addresses);
}
if(is_array($addresses[0]))
{
foreach($addresses[0] as $key => $val)
{
if(!preg_match("#^(10|172\.16|192\.168)\.#", $val))
{
$ip = $val;
break;
}
}
}
}
if(!$ip)
{
if(isset($_SERVER['HTTP_CLIENT_IP']))
{
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
}
return $ip;
}
我将得到的错误是:
Notice: Undefined variable: settings in
Notice: Undefined variable: addresses in
我可以通过添加" global:$ settings来解决所有问题;全球$地址;"但我想知道如何防止这种情况?我知道很多人声称我不应该在函数中使用全局变量,因此这让我想知道正确的方法。我还想知道为什么一位主持人会告诉我警告/通知而另一位主持人没有?我的主人没有关闭通知。
答案 0 :(得分:1)
您的问题都源于您使用未初始化的变量。如果你写
$foo = "abc";
在您的代码中,如果之前不存在$foo
,则会创建并初始化它。但是,如果你这样做:
$settings['ip_forwarded_check'] = 1;
然后你尝试引用一个从未创建的关联数组的项。让我们创建它:
$settings = array();
$settings['ip_forwarded_check'] = 1;
您还需要初始化$addresses
,但我不知道您的任务是否足以为您提供有关初始化方式的建议。
您的服务器上可能已关闭错误报告,这应该是您在那里看不到错误消息的原因。