• 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,则不会调用第二个表达式。

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

  • 相关阅读:
    几种绘制时间线图的方法
    分布式锁工具Redisson(Lua脚本)
    【机器学习算法】神经网络与深度学习-9 递归神经网络
    MySQL之索引
    外星人Alienware m16R1 原厂Windows11系统 oem系统
    EcmaScript标准-导入与导出-js
    【从0到1设计一个网关】什么是网关?以及为什么需要自研网关?
    Spring Boot项目开发实战:Spring Boot中的MVC支持
    艾美捷ProSci丨ProSci ST2 抗体说明书
    效率神器Apifox_API 文档、API 调试、API Mock、API 自动化测试工具推荐
  • 原文地址:https://blog.csdn.net/silence_pinot/article/details/138189901