如何正确访问超级全局变量?

12

我正在探索PHP的技巧。我发现有一件事情我没有答案。我想在类中访问超级全局变量$_SESSION的变量。一切都正常工作,但是用于检查代码混乱的PHPMD引擎向我显示了问题。

我是通过以下方式从$_SESSION超级全局变量获取值的

$value = $_SESSION["value"];

我这样编辑$_SESSION超级全局变量的值

$_SESSION['value'] = "newValue";

PHPMD 提示了以下问题:

访问超全局变量 $_SESSION。

所以我正在寻找另一种正确编辑和获取超全局变量 $_SESSION 值的方式。

我尝试使用 filter_input,但问题是当我将 INPUT_POST 作为类型(参数1)时,PHP 显示警告:

INPUT_SESSION 尚未实现。

感谢未来的回答 :)

编辑(来自 phpmd 文档的引用)

超全局变量 自:PHPMD 0.2. 直接访问超全局变量被认为是一种不好的做法。这些变量应该被封装在对象中,由框架提供。


你为什么要把这三个话题混在一起?语言特性、filter_input 的限制以及尤其是 PHPMD 是无关的。 - mario
看,我已经在问题中描述了所有的内容,让每个人都知道我想要什么。如果没有这三个主题很难描述它。很抱歉我把它们混在一个问题里。实际上,我只是想知道是否有其他方法可以访问和编辑 $_SESSION 超全局变量。 - UareBugged
第一个是正确的,也是唯一的方法。PHPMD“显示问题”只是一个建议(并不是非常聪明的建议)。 - mario
我曾经考虑过这个问题,但是你知道的,我不确定,这就是为什么我创建了这个问题。感谢您的时间。 - UareBugged
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

正如提示所述,访问superglobals违反了封装原则

一个非常基本的方法是:

class SessionObject
{
    public $vars;

    public function __construct() {
        $this->vars = &$_SESSION; //this will still trigger a phpmd warning
    }
}

$session = new SessionObject();
$session->vars['value'] = "newValue";

您还可以查看Symfony HttpFoundation组件进行全面实现。


2
所以最终的解决方案是像你的示例一样进行封装,并且抑制警告? - Bjinse

1

这只是一个“不好的做法”,你仍然可以直接访问超全局变量,如果你是“最佳实践”的支持者,可以创建一个类似于以下的小类:

class Session{

    public static function put($key, $value){
        $_SESSION[$key] = $value;
    }

    public static function get($key){
        return (isset($_SESSION[$key]) ? $_SESSION[$key] : null);
    }

    public static function forget($key){
        unset($_SESSION[$key]);
    }
}
以这种方式使用:
Session::put('foo', 'bar');
$bar = Session::get('foo');
Session::forget('foo');

你的代码仍然会触发警告,但现在是在你的类中。 - 8ctopus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,