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

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

相关推荐
追逐时光者6 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_6 小时前
敏捷开发流程-精简版
前端·后端
苏打水com6 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧7 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧7 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧7 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧7 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧8 小时前
Spring Cloud Gateway详解与应用实战
后端
EnCi Zheng9 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印6019 小时前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring