• php空合并运算符,三元运算符,PHP高级


    什么是空合并运算符

    提出问题

    下面的php代码,来自于laravel框架,请问这里的 ?是什么意思

    $request->user()?->tokenCan('*')
    
    • 1

    解释

    在这段 PHP 代码中,? 是一个 空合并运算符。它用于将两个表达式组合在一起,并返回第一个表达式的值,如果它不是 null 或 false,则返回第二个表达式的值。

    $request->user()?->tokenCan('*') 中,$request->user() 可能返回 null 或 false,如果用户未经身份验证。在这种情况下,? 运算符将阻止对 tokenCan() 方法的调用,并避免出现错误。

    如果 $request->user() 返回非 null 或 false 的值,则 ? 运算符将返回 tokenCan('*') 的值。

    以下是这段代码的示例:

    $request = new Request();
    
    // 用户未经身份验证
    $request->setUser(null);
    
    $result = $request->user()?->tokenCan('*');
    
    // $result 将为 false
    
    // 用户已经过身份验证
    $request->setUser(new User());
    
    $result = $request->user()?->tokenCan('*');
    
    // $result 将为 true 或 false,取决于用户的权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    总结

    在 PHP 中,? 运算符用于将两个表达式组合在一起,并返回第一个表达式的值,如果它不是 null 或 false,则返回第二个表达式的值。

    在 Laravel 框架中,? 运算符通常用于检查用户是否已经过身份验证,并在未经身份验证的情况下避免出现错误。

    空合并运算符的不同形式

    空合并运算符不是两个?吗,像这样 a??b而这里只有一个?有什么区别吗

    您说得没错,空合并运算符通常是两个 ?,例如 a ?? b。在这种情况下,它将返回第一个操作数的值,如果它不是 null 或 false,则返回第二个操作数的值。

    $request->user()?->tokenCan('*') 中,只有一个 ? 是因为 -> 运算符的优先级高于 ? 运算符。因此,$request->user()?->tokenCan('*') 将被解析为 ($request->user())?->tokenCan('*')

    在这种情况下,? 运算符仅用于检查 $request->user() 的返回值是否为 null 或 false。如果为 null 或 false,则不会调用 tokenCan() 方法。

    以下是两种写法的区别:

    // 两个 ?
    
    $result = $request->user() ?? $request->tokenCan('*');
    
    // 如果 $request->user() 为 null 或 false,则返回 $request->tokenCan('*') 的值。
    
    // 一个 ?
    
    $result = $request->user()?->tokenCan('*');
    
    // 如果 $request->user() 为 null 或 false,则不会调用 $request->tokenCan('*')。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    总结:

    • 两个 ? 用于将两个表达式组合在一起,并返回第一个表达式的值,如果它不是 null 或 false,则返回第二个表达式的值。
    • 一个 ? 用于检查第一个表达式的返回值是否为 null 或 false。如果为 null 或 false,则不会调用第二个表达式。

    在大多数情况下,使用两个 **?** 更加清晰易懂。但是,在某些情况下,使用一个 **?** 可以提高代码的效率。

  • 相关阅读:
    center进程间通信center
    静态代理IP是什么?一文看懂静态代理IP
    剑指offer!年薪300万P9大佬揭秘Spring全家桶手册,刷完入职字节
    书客护眼落地灯销量火爆,售罄、补货、又断货、再补货!又成断货王!
    Java完全自学手册,从外包到大厂,再到年薪100万都靠它
    matlab 求数字积分
    python文件的读取
    Python函数式编程进阶:用函数实现设计模式
    [数据结构] 树与二叉树
    《Vue.js 3移动应用开发实战》简介
  • 原文地址:https://blog.csdn.net/silence_pinot/article/details/138189901