彻底搞懂 PHP 运算符 ?: 和 ??

文章目录

快速掌握

?: 短三元运算符

?: 称之为短三元运算符,它是我们熟悉的三元运算符(也叫做条件运算符)的一种特殊写法,也就是省略了三元运算符中间的部分。

  • 复习一下三元表达式的语法:
    (expr1) ? (expr2) : (expr3)

    在 expr1 求值为 true 时的值为 expr2,在 expr1 求值为 false 时的值为 expr3。

    php 复制代码
    <?php
    // 三元运算符的例子
    $action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
    
    // 以上等同于以下的  if/else 语句
    if (empty($_POST['action'])) {
        $action = 'default';
    } else {
        $action = $_POST['action'];
    }
    ?>
  • 省略三元运算符中间部分的语法:
    expr1 ?: expr3

    如果 expr1 求值为 true 时返回 expr1 的结果,否则返回 expr3(expr1 在这里仅执行一次)。

    php 复制代码
    <?php
    echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1
    echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2
    echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3
    ?>

?? NULL 合并运算符

?? 语法:(expr1) ?? (expr2)

当 expr1 为 null,表达式 (expr1) ?? (expr2) 等同于 expr2,否则为 expr1。

下面是设置默认值的示例:

php 复制代码
<?php
// NULL 合并运算符的例子
$action = $_POST['action'] ?? 'default';

// 以上例子等同于于以下 if/else 语句
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}
?>
  • null 合并运算符的优先级较低。

    这意味着如果将它与其它运算符(比如字符串链接或者算术运算符)混合使用,可能需要括号。请看下面的示例:

    php 复制代码
    <?php
    // $name 未定义,引发警告。
    print 'Mr. ' . $name ?? 'Anonymous';
    
    // 打印 "Mr. Anonymous"
    print 'Mr. ' . ($name ?? 'Anonymous');
    ?>
  • 嵌套 NULL 合并运算符的示例:

    php 复制代码
    <?php
    
    $foo = null;
    $bar = null;
    $baz = 1;
    $qux = 2;
    
    echo $foo ?? $bar ?? $baz ?? $qux; // 输出 1
    
    ?>

附上官方文档查阅方式

  • 在线文档链接
    php.net 比较运算符,打开网页后 Ctrl+F搜索 ?: 或者 ??
  • 离线文档
    依次打开目录节点:目录 -> PHP 手册 -> 语言参考 -> 运算符 -> 比较运算符,同样Ctrl+F搜索 ?: 或者 ??
相关推荐
2401_834636992 小时前
Nginx 从入门到实战:静态 / 动态站点、PHP 部署与反向代理全解析
运维·nginx·php
绵绵细雨中的乡音12 小时前
监控显示一切正常,可用户根本打不开网站——Blackbox Exporter帮我找到了真相(1)
开发语言·php
右耳朵猫AI13 小时前
PHP周刊2026W22 | WordPress 7.0发布、Laravel 13.10.0、Polyfill 1.38.1、Symfony 8.1
php·laravel·symfony
AC赳赳老秦14 小时前
OpenClaw+AWS 深度应用:自动生成 CloudFormation 模板、批量管理 S3 存储桶
java·python·面试·职场和发展·php·deepseek·openclaw
IpdataCloud15 小时前
信贷审核中如何验证用户地址与IP属地一致性?用IP查询工具实现反欺诈
开发语言·tcp/ip·金融·php·ip
安妮的小熊呢15 小时前
CRMEB BZ v6.0 使用教程:从安装部署到后台基础配置
php·thinkphp·电商系统·crmeb
换个昵称都难15 小时前
WebRTC QoS 实战:从原理到弱网优化
开发语言·php·webrtc
不会写DN16 小时前
通过php 中的Route:: 的写法了解什么是静态类调用
android·java·php
Zhan86112416 小时前
深夜调试法国行情数据API接口的教训:法国CAC40指数WebSocket接入复盘
websocket·网络协议·php
爱装代码的小瓶子16 小时前
muduo库 --socket的封装
服务器·开发语言·php