如何解决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
相关产品推荐
相关产品推荐

