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

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

相关推荐
野犬寒鸦2 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈2 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
李梨同学丶4 小时前
0201好虫子周刊
后端
思想在飞肢体在追4 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
新缸中之脑6 小时前
Moltbook 帖子精选
开发语言·php
青岑CTF6 小时前
攻防世界-Web_php_include-胎教版wp
开发语言·安全·web安全·网络安全·php
Loo国昌7 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
遇见火星7 小时前
Linux综合性能监控工具dstat命令详解
linux·服务器·php·dstat
ONE_PUNCH_Ge7 小时前
Go 语言泛型
开发语言·后端·golang
良许Linux8 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式