使用三元运算符设置Session类属性及取消属性赋值时出现报错的技术求助
解决你的Session类登录检查代码问题
嗨,我来帮你搞定这个报错问题!你的代码里有几个语法和逻辑上的小问题,咱们一步步梳理修正:
你代码里的核心问题
- 属性访问错误:
$this->$signedIn多了一个多余的$,类属性访问应该是$this->signedIn(直接写属性名,不需要加$)。 - 三元运算符使用不当:你用
.(字符串拼接符)来连接多个赋值操作,这完全不符合三元运算符的语法——三元的每个分支必须是单个合法表达式,多个操作需要用括号包裹并通过逗号分隔(逗号在PHP里是表达式分隔符,会依次执行每个操作)。 - unset是语句而非表达式:你不能直接把
unset($this->userId)放在三元分支里,因为三元要求两边都是可求值的表达式,而unset是没有返回值的语句,直接放会报错。
修正后的三元运算符写法
如果坚持要用三元实现需求,可以这样写:
public function checkTheLogin() { isset($_SESSION['userID']) ? ($this->signedIn = true, $this->userId = $_SESSION['userID']) : ($this->signedIn = false, isset($this->userId) && unset($this->userId)); }
这里做了这些调整:
- 修正了属性访问的错误写法
- 用括号把多个操作包裹,通过逗号分隔,让每个分支成为合法的表达式
- 给unset加了
isset($this->userId)判断,避免尝试销毁未定义属性时抛出警告
更推荐的写法:if-else
虽然你想用三元,但当逻辑涉及多个操作时,if-else的可读性和维护性会好很多,代码也更直观:
public function checkTheLogin() { if (isset($_SESSION['userID'])) { $this->signedIn = true; $this->userId = $_SESSION['userID']; } else { $this->signedIn = false; if (isset($this->userId)) { unset($this->userId); } } }
这样写不仅不容易出错,后续维护代码的人也能一眼看懂逻辑。
内容的提问来源于stack exchange,提问作者Mishen Thakshana
相关产品推荐
相关产品推荐

