php8 ?-> nullsafe 操作符 使用教程

简介

PHP 8 引入了 ?->Nullsafe 操作符),用于简化 null 检查,减少繁琐的 if 语句或 isset() 代码,提高可读性。

?-> Nullsafe 操作符的作用

PHP 7 及以下,访问对象的属性或方法时,如果对象是 null,会导致致命错误 (Fatal error):

$person = null;
echo $person->name; // Fatal error: Uncaught Error: Trying to get property of non-object

解决方案(传统写法):

$person = null;
echo isset($person) ? $person->name : null;

PHP 8 解决方案(?->):

$person = null;
echo $person?->name; // 不会报错,直接返回 null

?-> 基本用法

访问对象的属性
class Person {public string $name = "John";
}$person = new Person();
echo $person?->name; // 输出 "John"$person = null;
echo $person?->name; // 输出 null,不会报错
访问对象的方法
class User {public function getName() {return "Alice";}
}$user = new User();
echo $user?->getName(); // 输出 "Alice"$user = null;
echo $user?->getName(); // 输出 null,不会报错
访问嵌套对象
class Address {public string $city = "New York";
}class Person {public ?Address $address = null;
}$person = new Person();
echo $person->address?->city; // 输出 null,不会报错$person->address = new Address();
echo $person->address?->city; // 输出 "New York"
?-> 结合数组

不能用于数组索引([]),但可以用于 ArrayAccess 对象

$data = null;
echo $data?['key']; // 语法错误:不能用于数组

解决方案:使用 ArrayAccess 对象

class Collection implements ArrayAccess {private array $items = ['name' => 'Alice'];public function offsetExists($offset) { return isset($this->items[$offset]); }public function offsetGet($offset) { return $this->items[$offset] ?? null; }public function offsetSet($offset, $value) { $this->items[$offset] = $value; }public function offsetUnset($offset) { unset($this->items[$offset]); }
}$collection = new Collection();
echo $collection?->offsetGet('name'); // 输出 "Alice"$collection = null;
echo $collection?->offsetGet('name'); // 输出 null,不会报错
?-> 结合函数返回值
function getUser() {return null;
}echo getUser()?->name; // 输出 null,不会报错
?-> 结合链式调用

PHP 8 允许链式 ?-> 操作,简化复杂的 null 检查:

class Department {public ?Person $manager = null;
}$department = new Department();// 传统写法
echo isset($department->manager) ? $department->manager->name : null;// PHP 8 `?->`
echo $department?->manager?->name; // 输出 null,不会报错
?-> 结合赋值

?-> 不能用于赋值,只能用于访问!

$person = null;// 不能用 `?->` 进行赋值
$person?->name = "John"; // 语法错误

解决方案:

if ($person !== null) {$person->name = "John";
}
?-> 不能用于静态方法
class Test {public static function hello() {return "Hello";}
}echo Test?->hello(); // ❌ 语法错误

静态方法必须用 :: 访问,不支持 ?->

解决方案:

echo isset(Test::hello) ? Test::hello() : null;
?-> 和 ?? 的区别

?-> 用于对象,?? 用于 null 合并

$person = null;// `?->` 适用于对象
echo $person?->name; // 返回 null// `??` 适用于变量为空时提供默认值
echo $person?->name ?? "Default Name"; // 输出 "Default Name"
  • ?-> 用于安全访问对象的属性或方法。

  • ?? 用于 null 合并,提供默认值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WORD+VISIO输出PDF图片提高清晰度的方法

WORDVISIO输出PDF图片提高清晰度的方法 part 1: visio 绘图part 2: word 导出 part 1: visio 绘图 先在visio中把图片和对应的文字调整为适合插入到文章中的尺寸; 在visio中把所有元素进行组合; 把组合后的图片长和宽等比例放缩,如放大10倍…

重要头文件下的函数

1、<cctype> #include<cctype>加入这个头文件就可以调用以下函数&#xff1a; 1、isalpha(x) 判断x是否为字母 isalpha 2、isdigit(x) 判断x是否为数字 isdigit 3、islower(x) 判断x是否为小写字母 islower 4、isupper(x) 判断x是否为大写字母 isupper 5、isa…

基于大模型预测不稳定性心绞痛的多维度研究与应用

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、不稳定性心绞痛概述 2.1 定义与分类 2.2 发病机制 2.3 临床表现 三、大模型技术原理与应用基础 3.1 大模型介绍 3.2 在医疗领域的应用现状 3.3 用于不稳定性心绞痛预测的可行性 四、术前预…

第一讲—函数的极限与连续(一)

思维导图 笔记 双曲正弦函数及其反函数

Mac VM 卸载 win10 安装win7系统

卸载 找到相应直接删除&#xff08;移动到废纸篓&#xff09; 可参考&#xff1a;mac如何卸载虚拟机win 下载 win7下载地址

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先&#xff0c;我们详细介绍了SSM框架&#xff0c;这是一种经典的Java Web开发框架&#xff0c;由Spring、SpringMVC和MyBatis三个开源项目整合而成&#xff0c;为开发企业级应用提供了高效、灵活、…

网络安全的现状与防护措施

随着数字化和信息化的迅猛发展&#xff0c;互联网已成为人们日常生活、工作和学习不可或缺的一部分。然而&#xff0c;随着网络技术的普及&#xff0c;网络安全问题也日益突出。近年来&#xff0c;数据泄露、恶意软件、网络攻击等事件层出不穷&#xff0c;给企业和个人带来了巨…

android databinding使用教程

Android DataBinding 是一种可以将 UI 组件与数据源绑定的框架&#xff0c;能够减少 findViewById 的使用&#xff0c;并提高代码的可维护性。下面是 DataBinding 的完整使用教程&#xff1a; 1. 启用 DataBinding 在 build.gradle&#xff08;Module 级别&#xff09;中启用 …

python如何快速删除文件夹中的大量文件

在 Python 中&#xff0c;删除文件夹中的大量小图片文件可以通过使用 os 模块或 shutil 模块来实现。以下是一个示例代码&#xff0c;展示了如何快速删除指定文件夹中的所有文件。如果你只需要删除小图片文件&#xff0c;可以添加额外的逻辑来检查文件大小。 以下是一个示例代…

如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)

以下是详细步骤&#xff1a; 1. 创建项目 1.1 打开 IntelliJ IDEA。 1.2 在启动界面&#xff0c;点击 Create New Project&#xff08;创建新项目&#xff09;。 1.3 选择 Java&#xff0c;然后点击 Next。 1.4 确保 Project SDK 选择了正确的 JDK 版本&#x…

FastAPI-Cache2: 高效Python缓存库

FastAPI-Cache2是一个强大而灵活的Python缓存库&#xff0c;专为提升应用性能而设计。虽然其名称暗示与FastAPI框架的紧密集成&#xff0c;但实际上它可以在任何Python项目中使用&#xff0c;为开发者提供简单而高效的缓存解决方案。 在现代应用开发中&#xff0c;性能优化至关…

android开发:zxing-android-embedded竖屏扫描功能

Android 点击按钮调用竖屏二维码扫描 提示&#xff1a;zxing-android-embedded插件已过时&#xff0c;建议更换别的。 场景&#xff1a;Home页面上有个扫描按钮&#xff0c;点击后打开摄像头完成扫描功能&#xff0c;扫描时要求竖屏。 方案&#xff1a;使用zxing-android-embe…

指令补充+样式绑定+计算属性+监听器

一、指令补充 1. 指令修饰符 1. 作用: 借助指令修饰符, 可以让指令更加强大 2. 分类: 1> 按键修饰符: 用来检测用户的按键, 配合键盘事件使用. keydown 和 keyup 语法: keydown.enter/v-on:keydown.enter 表示当enter按下的时候触发 keyup.enter/v-on:keyup.enter 表示当…

Python基于时间序列分析的降雨量预测系统的设计与实现【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

【2022】【论文笔记】基于相变材料的光学激活的、用于THz光束操作的编码超表面——

前言 类型 太赫兹 + 超表面 太赫兹 + 超表面 太赫兹+超表面 期刊 A D V A N C E D    O P T I C A L    M A T E R I A L S ADVANCED \; OPTICAL \; MATERIALS

[VolgaCTF 2025] Baby-Welcome,BrokeBroke,Field Rules

这个就做了俩题&#xff0c;其实再努力点就是3个。不过最近也算是好成绩了&#xff0c;45名。国外的比赛对我来说还算是比较难的。 Baby-Welcome 这个流程还挺麻烦&#xff0c;先是注册用户&#xff0c;登录的用户可以给其它用户发消息。收到消息的用户可以显示消息&#xff…

再见VS Code!Google IDE 正颠覆传统开发体验

云端开发的革命&#xff1a;Google Project IDX 如何颠覆传统开发体验 在软件开发领域&#xff0c;Google 最新推出的 Project IDX 绝非仅仅是另一个“基于浏览器的 VS Code”——它是一次真正的范式转变。与 VS Code、Cursor 等传统工具不同&#xff0c;IDX 是一个完全云原生的…

NLP高频面试题(三十六)——深入理解思维链(Chain-of-Thought)提示方法

一、什么是思维链提示&#xff08;CoT&#xff09;&#xff1f; 思维链提示是一种新颖的提示方法&#xff0c;通过向模型提供少量的推理步骤示范&#xff0c;让语言模型在给出最终答案之前展示出自己的推理过程。其核心思想在于鼓励模型模仿人类逐步推理的方式&#xff0c;从而…

探索新一代大模型代理(LLM agent)及其架构

在人工智能大模型(AI)的浪潮中&#xff0c;2023年我们见证了检索增强生成(Retrieval Augmented Generation, RAG)的兴起&#xff0c;而2024年则无疑成为了“代理”agent的元年。各大AI企业纷纷投身于聊天机器人代理的研发中&#xff0c;工具如MultiOn通过与外部网站的连接实现了…

26考研——线性表_ 线性表的链式表示_双循环链表(2)

408答疑 文章目录 三、 线性表的链式表示双循环链表单链表与双链表的比较单链表的特点双链表的特点 双链表上基本操作的实现双链表的插入操作双链表的删除操作 双链表的代码实操定义结点创建一个结点带头结点的双链表初始化创建双链表打印双链表查找结点插入结点在指定节点后插…