V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhengfan2016
V2EX  ›  PHP

大佬们,请问??是什么运算符

  •  
  •   zhengfan2016 · 2022-02-22 21:23:51 +08:00 · 3443 次点击
    这是一个创建于 1007 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,laravel 写的应用看到的,用谷歌搜"php ??" 或"laravel ??" 都没找到说明。 看起来有点像简化的三元运算符? bp9vpq.png

    24 条回复    2022-02-24 16:18:08 +08:00
    kiracyan
        1
    kiracyan  
       2022-02-22 21:26:26 +08:00   ❤️ 1
    一般来说是空判断
    noe132
        2
    noe132  
       2022-02-22 21:27:16 +08:00
    Null coalescing operator
    其他语言比较常见了,像 JS, C# 都有类似的
    anguiao
        3
    anguiao  
       2022-02-22 21:28:45 +08:00   ❤️ 3
    搜“php double question mark”可以搜到,空值合并,Google 对符号关键词好像不太友好。
    zhengfan2016
        4
    zhengfan2016  
    OP
       2022-02-22 21:28:52 +08:00   ❤️ 1
    @kiracyan #1 大佬,请问$a ?? $b 是不是可以理解成

    issue($a) ? $a : $b;

    不知道我这个对不对 QAQ
    cwcc
        5
    cwcc  
       2022-02-22 21:31:11 +08:00   ❤️ 1
    如果 `$this->meta` 中没有 title 字段,那么本来 PHP 会报错或者置空;但是 ?? 的话,如果发生了前面取不到或者前面的值为 null 的话,就取后面的值,有点类似于 getSomething($key, $default_value),传入了一个不存在时候的默认值。
    cwcc
        6
    cwcc  
       2022-02-22 21:33:15 +08:00
    $a ?? $b 的情况下,基本上是等同于 `isset($a) ? (is_null($a) ? $b : $a) : $b`
    cwcc
        7
    cwcc  
       2022-02-22 21:33:57 +08:00
    哦不太对,我也忘记了,isset 好像自身就有判断是否为 null 的功能的
    zhengfan2016
        8
    zhengfan2016  
    OP
       2022-02-22 21:34:44 +08:00
    @crazywhalecc #5
    @anguiao #3
    @noe132 #2 学习了,感谢大佬们的解答
    sagaxu
        9
    sagaxu  
       2022-02-22 21:39:28 +08:00
    xx 语言里看不懂的运算符,那就搜 xx operator precedence ,一般会有个完整的运算符表格
    sorshion
        10
    sorshion  
       2022-02-22 21:56:10 +08:00
    Removable
        11
    Removable  
       2022-02-22 22:40:35 +08:00 via iPhone
    c#来说:
    var a = b == null ? c : b;
    可以写成
    var a = b ?? c;
    wonderfulcxm
        12
    wonderfulcxm  
       2022-02-22 22:53:50 +08:00 via iPhone
    这是新的语法糖呀……
    512357301
        13
    512357301  
       2022-02-22 23:02:16 +08:00 via Android
    好像是 php7.x 某个版本还是 php8 来着新出的运算符,用来简化标准的三元运算符呢
    shoaly
        14
    shoaly  
       2022-02-22 23:30:05 +08:00
    其实没什么用, 因为之前就可以 $this->title = $this->title ?: "default" , 我实在没想通 ?: 为啥要升级成 ?? , 看起来更吓人了, 语义上也没更清楚, 字符也没少敲一个
    sadfQED2
        15
    sadfQED2  
       2022-02-22 23:46:39 +08:00 via Android
    @shoaly 有区别,?:会有 undefined 错误,??不会
    pcbl
        16
    pcbl  
       2022-02-22 23:55:37 +08:00 via Android
    可以简单理解为如果左侧表达式为 false 就取右边的值
    shoaly
        17
    shoaly  
       2022-02-22 23:58:12 +08:00
    @sadfQED2 警告关闭即可
    eason1874
        18
    eason1874  
       2022-02-23 01:17:01 +08:00   ❤️ 3
    @shoaly #17 你这句话让我笑出声,想起那个笑话

    一群游客路过悬崖边,所有人都安全通过,只有 PHP 程序员掉下去了,因为 PHP 程序员的习惯是无视警告(看不见警告牌)
    msg7086
        19
    msg7086  
       2022-02-23 05:29:02 +08:00
    @eason1874 0 error(s)(
    shoaly
        20
    shoaly  
       2022-02-23 09:34:02 +08:00   ❤️ 1
    @eason1874 偏偏....大部分框架都默认关闭了警告显示, 就留下了笑出声的你
    lisongeee
        21
    lisongeee  
       2022-02-23 10:26:19 +08:00
    js 里面 a ?? b 表示 (a===null || a=== undefined) ? b : a
    kotlin 里面 a ?: b 表示 a==null ? b:a
    它们都有可选链,a?.b?.c 表示 a==null ? a: (a.b==null ? a.b : a.b.c)
    现在很多语言的新语法,空安全基本都是标配了
    xiao109
        22
    xiao109  
       2022-02-23 13:26:12 +08:00
    你直接搜 ?? 谷歌会真的当问号,你可以把两个问号换成 double question mark 。这样就会搜到了
    MCyunpeng98
        23
    MCyunpeng98  
       2022-02-24 11:21:52 +08:00
    php ?? 是 php7.0 版本的新增特性
    $username = $_GET['user'] ?? 'nobody';
    等于
    username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

    参考链接: https://www.php.net/manual/zh/migration70.new-features.php
    Evilk
        24
    Evilk  
       2022-02-24 16:18:08 +08:00
    还是习惯用完整的三元运算符
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3188 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:35 · PVG 21:35 · LAX 05:35 · JFK 08:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.