函数未定义的变量错误,不使用全局

时间:2017-03-19 09:50:43

标签: php

最近一直在审查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来解决所有问题;全球$地址;"但我想知道如何防止这种情况?我知道很多人声称我不应该在函数中使用全局变量,因此这让我想知道正确的方法。我还想知道为什么一位主持人会告诉我警告/通知而另一位主持人没有?我的主人没有关闭通知。

1 个答案:

答案 0 :(得分:1)

您的问题都源于您使用未初始化的变量。如果你写

$foo = "abc";

在您的代码中,如果之前不存在$foo,则会创建并初始化它。但是,如果你这样做:

$settings['ip_forwarded_check'] = 1;

然后你尝试引用一个从未创建的关联数组的项。让我们创建它:

$settings = array();
$settings['ip_forwarded_check'] = 1;

您还需要初始化$addresses,但我不知道您的任务是否足以为您提供有关初始化方式的建议。

您的服务器上可能已关闭错误报告,这应该是您在那里看不到错误消息的原因。