You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Session::get()非静态方法被静态调用警告及Token类调试问题

解决Non-static method Session::get() should not be called statically警告

嘿,这个警告的根源其实非常明确——你在Token类里用静态调用语法(Session::get())去调用了一个非静态方法,PHP从8.0版本开始会严格限制这种不规范的用法,所以抛出了Deprecated警告。

问题定位

警告里指定的第13行,就是Token::check()方法中的这一行:

if (Session::exists($tokenName) && $token === Session::get($tokenName)) { 

这里你用了::(静态调用的语法)去调用Session类的get()方法,但这个方法本身并没有被定义为static。顺带一提,你在generate()里用的Session::put()和check()里的Session::exists(),如果这两个方法也不是静态的,同样会触发类似警告,只是可能你还没注意到。

两种解决方案

根据你的Session类设计,你可以选择以下任意一种方案:

方案1:将Session类的对应方法改为静态(推荐)

从你的代码使用方式来看,Session更像是一个全局工具类,所以直接把里面的get()、put()、exists()都改为静态方法是最贴合场景的:

class Session {
    // 修正get方法为静态
    public static function get($key) {
        // 这里替换成你原来的get方法逻辑,比如:
        return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
    }

    // 修正put方法为静态
    public static function put($key, $value) {
        return $_SESSION[$key] = $value;
    }

    // 修正exists方法为静态
    public static function exists($key) {
        return isset($_SESSION[$key]);
    }
}

修改后,Token类里的所有静态调用就都合法了,警告会直接消失。

方案2:实例化Session类后调用实例方法

如果Session类原本是面向实例设计的(比如包含实例属性或需要依赖注入),那你需要先创建Session实例,再调用实例方法:

class Token { 
    public static function generate() { 
        $session = new Session();
        return $session->put(Config::get('session/token_name'), md5(uniqid())); 
    } 
    public static function check($token) { 
        $tokenName = Config::get('session/token_name'); 
        $session = new Session();
        if ($session->exists($tokenName) && $token === $session->get($tokenName)) { 
            return true; 
        } 
        return false; 
    } 
}

总结

本质问题就是静态调用语法与方法定义不匹配,只要让方法定义和调用方式保持一致(要么都静态,要么都用实例),就能解决这个警告啦。

内容的提问来源于stack exchange,提问作者Favour Emmanuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:28:58