You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:15:31