Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你认为PHP在类方法中访问超全局变量是不好的吗?_Php_Oop_Login_Session_Superglobals - Fatal编程技术网

你认为PHP在类方法中访问超全局变量是不好的吗?

你认为PHP在类方法中访问超全局变量是不好的吗?,php,oop,login,session,superglobals,Php,Oop,Login,Session,Superglobals,以类帐户中的login()函数为例 class Account { /* Class variables */ public function login() { if(isset($_POST['username']) && isset($_POST['password'])) return $this->_formLogin(); else if(isset($_SESSION['accountId']))

类帐户中的
login()
函数为例

class Account {
 /* Class variables */

    public function login() {
        if(isset($_POST['username']) && isset($_POST['password']))
            return $this->_formLogin();
        else if(isset($_SESSION['accountId']))
            return $this->_sessionLogin();
        else if(isset($_COOKIE['username']) && isset($_COOKIE['password']))
            return $this->_cookieLogin();
        else return false;
    }

    private function _formLogin() {
        //perform login actions using $_POST data
    }
    /* All that other stuff */
}
在这一刻,试着忽略任何关于数据清理、密码加密等看不见的方法的担忧。严格专注于
login()
,这种全局访问是不是很糟糕?我通常避免在类中使用PHP超级全局变量,但我想不出在这种情况下不这样做的好理由

我可以理解为什么您不希望全局变量在类之间交互的背景中产生魔力,但是这些全局变量是内置在PHP中的,不被类修改,并且只被这个类使用

这将导致在需要用户登录的页面开头出现这种情况:

$user = new Account($whatever, $objects, $we, $depend, $on);
if($user->login()) {
    //Do this stuff when logged in
}
而不是在每一页上,其逻辑稍后可能需要更改:

$user = new Account($whatever, $objects, $we, $depend, $on);
if(isset($_POST['username']) && isset($_POST['password']))
    $user->formLogin($_POST['username'], $_POST['password']);
else if(isset($_SESSION['accountId']))
    $user->sessionLogin($_SESSION['accountId']);
else if(isset($_COOKIE['username']) && isset($_COOKIE['password']))
    $user->cookieLogin($_COOKIE['username'], $_COOKIE['password']);
if($user->isLoggedIn() {
    //Do this stuff when logged in
}

虽然我知道在类之外创建一个函数来处理这个问题是一种选择,但这难道不会像在类中混淆全局函数一样糟糕吗?

我认为这取决于应用程序的设计。如果这个类是一个普通的、松散耦合的类或模块,并且突然使用了这样的全局变量,那么在我的书中这将是一个糟糕的做法。但是,如果这个类明确地面向一个特定的任务,而这些特定的全局变量无论如何都是需要的(例如您的登录示例),那么我看不到任何明确的反对意见

为了回答我自己的问题,我想说是的,访问超级全局变量是可以的,只要您不修改它们以跨多个类访问。背景中没有什么神奇的东西——你只是在阅读状态,而超级全局是PHP为你提供的


但是,您永远不应该在类中修改全局文件并在其他地方访问它。这就是使单元测试变得不可能的时候。

一种方法是将所有超全局函数封装到一个自己的类中。我很确定Zend Framework有自己的一个类,例如用于操作Cookies。

我不会说这个问题有一个直接的肯定或否定答案。(对于所有superglobals
$\u GET
$\u POST
$\u SESSION
)的想法是,您请求的数据位于整个应用程序中,而不是您请求的范围的本地数据

这些超全局变量可能发生的情况是,如果它们在函数执行之前或执行过程中出于任何原因发生了变化,会怎么样。这可能是一个非常讨厌的错误复制


因此,我认为这是一种糟糕的形式。

那么这个问题只是你在自言自语吗?@cletus常见问题解答告诉你,使用答案形式将你的答案发布到你自己的问题上,而不要将其放在你的问题中。如果它被否决了,我就会知道我错了,而全球选手给了我一种讨厌的感觉,我需要某种保证我所做的是对的。“仅仅阅读状态”已经够糟糕的了。但我同意,阅读《全球状态》比写《全球状态》的坏处要小。+1非常好的一点。我从来没有修改过超全局变量,所以我从来没有想过它们会在其他地方被修改,并且以后会依赖于数据保持不变。也许有一种方法可以锁定超全局变量,这样在脚本开始后它们就不能被更改了?我会调查的。