PHP中双问号(??)与单问号(三目运算符)的区别及结果差异咨询
空合并运算符
??和三元运算符? :的区别及你的代码问题解析 你的代码结果不同的原因
你第一个代码的写法是错误的,把isset()和??混用了,导致逻辑完全偏离预期:
第一个代码:
$course = isset($params->course_id) ?? NULL;isset($params->course_id)返回的是布尔值(变量存在且非null时为true,否则为false)。当你提交空值(比如course_id不存在或为null),isset()返回false,而??的逻辑是“左边表达式不是null就返回左边”,false不是null,所以最终赋值为false。数据库通常会把布尔false转成0存储,所以结果是0。第二个代码:
$course = isset($params->course_id) ? $params->course_id : NULL;
当course_id不存在或为null时,isset()返回false,直接赋值NULL,数据库存储的就是NULL,这和第一个代码的逻辑完全不同。
两个运算符的正确用法与区别
1. 空合并运算符??
- 语法:
$变量 ?? 默认值 - 核心逻辑:判断左边变量是否存在且不为
null,满足则返回变量值,否则返回默认值。它本身已经包含了isset()的判断,不需要额外嵌套。 - 示例:
// 当$params->course_id不存在或为null时,返回NULL;否则返回course_id的值(包括0、空字符串等) $course = $params->course_id ?? NULL;
2. 三元运算符? :
- 语法:
判断条件 ? 条件为true时的值 : 条件为false时的值 - 核心逻辑:先把
判断条件转换成布尔值,再决定返回哪一边。如果直接用变量作为判断条件,会把0、''、false、null这些值都当成false处理。 - 示例:
// 当$params->course_id转换成布尔值为true时返回它,否则返回NULL(比如0、空字符串都会触发返回NULL) $course = $params->course_id ? $params->course_id : NULL; // 如果要和??等价,需要用isset()作为判断条件 $course = isset($params->course_id) ? $params->course_id : NULL;
关键区别总结
??只关心变量是否存在、是否为null,不会把0、空字符串这类“空值”当成无效值;- 三元运算符如果直接用变量做判断,会把所有布尔为
false的值都当成无效值;如果用isset()配合三元运算符,效果和??一致,但??写法更简洁。
内容的提问来源于stack exchange,提问作者chiper4
相关产品推荐
相关产品推荐

