ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-13 10:29:48  阅读:261  来源: 互联网

标签:php oop session login superglobals


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有