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

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

相关推荐
JuiceFS28 分钟前
深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
运维·后端
站大爷IP34 分钟前
python3如何使用QT编写基础的对话框程序
后端
老夫运道一向好41 分钟前
【YashanDB监控运维平台(YCM)】登录安全设置
后端
bing_1581 小时前
Spring Boot 中ConditionalOnClass、ConditionalOnMissingBean 注解详解
java·spring boot·后端
凌览1 小时前
斩获 7k Star,这个桌宠项目火了🔥
前端·javascript·后端
用户0595661192091 小时前
Java 基础篇必背综合知识点总结包含新技术应用及实操指南
java·后端
小杰来搬砖1 小时前
对 JWT(JSON Web Token)令牌的完整讲解
后端
YUJIANYUE1 小时前
PHP7+MySQL5.6 雪里开简易预约制访客管理系统V1.0
mysql·php
他日若遂凌云志2 小时前
Redis 分布式集群与主从复制的一键部署脚本:从繁琐到高效的自动化方案
后端