一周前正常,现调用$logged_user->show()报字符串调用方法错误求排查
问题排查思路:调用字符串的show()方法错误
这种情况我碰到过好几次,核心问题肯定是**$logged_user不是你期望的类实例,而是被意外赋值成字符串了**!虽然你用class_exists()验证了类存在,但这个函数只能确认类定义存在,没法保证你的变量是该类的实例。下面是具体的排查和解决步骤:
先直观查看变量类型:在profile.php第14行(也就是调用
$logged_user->show("Email")的前一行)加上调试代码:var_dump($logged_user); exit;运行后看输出——如果是字符串(比如用户ID、错误提示、用户名这类内容),那直接就能定位问题根源了。
检查
$user创建$logged_user的逻辑:
你提到$logged_user是由负责注册/匿名功能的$user对象创建的,那要去看对应的创建方法(比如$logged_user = $user->getLoggedUser()这类代码):- 是不是方法在某些分支下返回了字符串?比如登录失败时返回"未登录",而不是返回类实例或者null;
- 最近有没有修改过这个方法的返回值?比如之前返回实例,现在不小心改成返回用户ID字符串了;
- 构造函数会不会抛出异常?如果实例化过程出错,有没有错误捕获逻辑把错误信息赋值给了
$logged_user?
用
instanceof替代class_exists()做实例验证:class_exists()只能验证类存在,要确认变量是该类的实例,应该用instanceof,比如:if ($logged_user instanceof YourUserClassName) { echo $logged_user->show("Email"); } else { // 这里可以记录日志或者输出调试信息 error_log("Expected User instance, got: " . gettype($logged_user)); var_dump($logged_user); }排查会话/存储的用户数据:
如果$logged_user是从会话(比如$_SESSION['logged_user'])或者缓存中读取的,要注意PHP会话默认不能直接存储对象(除非你做了序列化处理)。如果序列化失败,可能会把对象变成字符串或者其他无效类型,导致取出的不是实例。
内容的提问来源于stack exchange,提问作者Jan Kocvik
相关产品推荐
相关产品推荐

