调用非静态方法User::getUserId()报错,PHP用户信息获取问题求助
解决你的两个报错问题
1. 非静态方法静态调用的警告(Deprecated: Non-static method User::getUserId() should not be called statically)
这个问题其实很好理解:你在profile.php里直接用User::getUserId()这种静态调用方式去调用了一个非静态方法。因为你的getUserId()是实例方法(没有加static关键字),必须先创建User类的实例对象,再通过这个实例来调用它。
两种解决思路:
- 推荐方案:实例化对象后调用(符合你用getter/setter的规范)
- 备选方案:把方法改成静态(适合不需要维护实例状态的场景)
实例化调用的代码示例:
假设你的User.class.php里的方法是这样的:
class User { private $userId; private $email; // ...其他属性和对应的setter方法 public function getUserId() { // 非静态getter方法 return $this->userId; } // 新增一个根据邮箱加载用户信息的方法 public function loadUserByEmail($email) { // 这里写查询数据库的逻辑,把查到的用户信息赋值给类属性 // 示例:$this->userId = $db_result['user_id']; // $this->email = $db_result['email']; return $this; // 返回实例方便链式调用 } }
那在profile.php里应该这么写:
// 先启动session(登录逻辑里肯定已经用了,这里再确认) session_start(); // 从session中取出登录用户的邮箱(登录成功后应该存在这里) $email = $_SESSION['user_email'] ?? null; // 实例化User对象 $user = new User(); // 加载用户信息 $user->loadUserByEmail($email); // 调用getter获取用户ID $userId = $user->getUserId();
静态方法的代码示例(如果业务允许):
修改User.class.php的方法:
class User { public static function getUserId($email) { // 直接查询数据库返回用户ID,不需要依赖实例 // 示例:return $db->query("SELECT user_id FROM users WHERE email = ?", [$email])->fetchColumn(); } }
然后在profile.php里调用:
$userId = User::getUserId($email);
2. 未定义变量$email的提示(Notice: Undefined variable: email)
这个提示说明你在profile.php里使用$email变量之前,没有给它赋值。登录成功后,你肯定需要把用户的标识(比如邮箱、ID)存在session里,这样在profile.php才能拿到。
解决步骤:
- 登录成功时存储用户信息到session(比如在登录处理页login.php):
session_start(); // 假设验证用户成功后,从数据库拿到了用户邮箱 $_SESSION['user_email'] = $validated_user_email;
- 在profile.php里取出并定义$email:
session_start(); // 先检查用户是否已登录,避免非法访问 if (!isset($_SESSION['user_email'])) { header("Location: login.php"); // 未登录就跳回登录页 exit; } // 定义$email变量 $email = $_SESSION['user_email'];
这样就不会再出现Undefined variable: email的提示了。
总结一下:先从session中拿到登录用户的邮箱/ID,再通过实例化User对象调用非静态方法(或者改成静态方法传参调用),就能解决这两个问题啦。
内容的提问来源于stack exchange,提问作者Distortion
相关产品推荐
相关产品推荐

