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

什么是空合并运算符

提出问题

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

php 复制代码
$request->user()?->tokenCan('*')

解释

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

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

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

以下是这段代码的示例:

php 复制代码
$request = new Request();

// 用户未经身份验证
$request->setUser(null);

$result = $request->user()?->tokenCan('*');

// $result 将为 false

// 用户已经过身份验证
$request->setUser(new User());

$result = $request->user()?->tokenCan('*');

// $result 将为 true 或 false,取决于用户的权限

总结

在 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() 方法。

以下是两种写法的区别:

php 复制代码
// 两个 ?

$result = $request->user() ?? $request->tokenCan('*');

// 如果 $request->user() 为 null 或 false,则返回 $request->tokenCan('*') 的值。

// 一个 ?

$result = $request->user()?->tokenCan('*');

// 如果 $request->user() 为 null 或 false,则不会调用 $request->tokenCan('*')。

总结:

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

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

相关推荐
wuyikeer18 分钟前
Spring Framework 中文官方文档
java·后端·spring
Victor35622 分钟前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor35631 分钟前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer1 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP2 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪
人间打气筒(Ada)2 小时前
如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层
开发语言·后端·golang
开心就好20252 小时前
使用Wireshark进行TCP数据包抓包分析:三次握手与四次挥手详解
后端·ios
用户4419395054872 小时前
OpenClaw服务器部署保姆级教程
后端
zdl6862 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
Soofjan2 小时前
sync.Mutex讲解
后端