编程语言
首页 > 编程语言> > 您是否认为PHP中的错误形式是在类方法中访问超级全局变量?

您是否认为PHP中的错误形式是在类方法中访问超级全局变量?

作者:互联网

以类帐户中的示例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 */
}

试着忽略对数据清理,密码腌制等看不见的方法的任何担忧.严格注重登录(),这是全球访问坏juju?我通常避免在类中使用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
}

虽然我知道在类之外创建一个函数来处理它是一个选项,这不会像在类中混淆全局变量一样糟糕吗?

解决方法:

我不会说这个答案是肯定的或没有答案.这个想法(与所有超级全局$_GET $_POST $_SESSION一起)是您要求的数据位于整个应用程序中,而不是您要求的范围本地.

这些超级全球可能会发生的事情是,如果他们在你的功能执行期间因某种原因而在某处或者(上帝保佑)改变了.这可能会成为一个非常恼人的错误重现.

所以我会说这是糟糕的形式.

标签:php,oop,session,login,superglobals
来源: https://codeday.me/bug/20190713/1448669.html