[精选] PHP8新特性,Nullsafe(空安全运算符)如何用 ?

学习就要学习新的技术,新的版本!这是每个程序员一贯的作风。与时俱进,你才不会被很快的淘汰掉。所以,作为phper的你,你必须要学php8了哦!

今天给大家讲解的一个新特性,很实用也有方便。

PHP8中引入了nullsafe运算符,允许在一个对象链式调用对象方法或属性。在链式调用过程中,某个对象方法或属性可能是空的,如果是空的,就会报null错误。nullsafe就很好的解决了这个问题。

nullsafe运算符

语法:?->

介绍:

PHP8中引入了nullsafe运算符,允许在一个对象链式调用对象方法或属性。

在链式调用过程中,某个对象方法或属性可能是空的,如果是的,就会报null错误。nullsafe就很好的解决了这个问题。

nullsage案例

以更加贴近开发的案例作为演示,这里我使用Laravel框架。

需求:用户登录后,在blade模板中显示用户名,我们会这么调用:auth()->user()->name,假设user中没有name,那么这样调用就会报错。现在就用PHP8中的方法来解决这个问题。

// web.php

// 案例一
Route::get('a', function () {
   return auth()->user()?->name;
});
// 案例二
Route::get('b', function () {
   return auth()?->user()?->name;
});

案例一:当auth()调用user()时,user再使用?->去调用name属性,如果name为null,那么就直接返回null,因此,它是有返回值,其值为null

案例二:当auth()调用user时,使用?->,就是在说,有user()这个对象吗,有的话继续使用user()调用其值,没有的话就直接返回null。

PHP7 null合并运算

??是PHP7中引入的新特性更,用来替代三元运算isset()函数功能结合一起使用。如果存在且不是 NULL 空合并运算符返回它的第一个操作数;否则返回第二个操作数。

// 以前的写法
$name = isset($_GET['name']) ? $_GET['name'] : '温新';
// php7及以后的写法
// 获取get参数值,不存在则返回 '自如初'
$name = $_GET['name'] ?? '自如初';

下面还是以Laravel为例子,使用??演示一个功能。

当查询一个不存在的用户时,可以直接返回其他数据,如下:

Route::get('a', function () {
  $user = \App\Models\User::find(111) ?? '没有数据';
  dd($user);
});

本文转自:mp.weixin.qq.com/s/dquHnGxoZIwQxQW...

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
最美的不是下雨天,而是和你一起躲过的屋檐!
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

对于空安全可能理解上有些出入:
例如在代码中使用到 $value = $param1?->$param2
1.空安全判断的是针对于$param1的判断,若$parma1为null则?->不管调用什么属性和方法$value值为null
2.而不是判断是否存在后面的属性或是方法
3.若$param1存在(不为空)但是不包含后续调用的属性或是方法仍然会报错

1年前 评论

根据官方文档中的解释还有示例来看,这段是有问题的

file

官方文档:

file

示例:

<?php

// 自 PHP 8.0.0 起可用
$result = $repository?->getUser(5)?->name;

// 上边那行代码等价于以下代码
if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}
?>

在案例二中根据官方解释你的代码应该是等价于:

if  (is_null(auth()))  { 
    $result =  null;  
}  else  { 
    $user = auth()->user();  
    if  (is_null($user))  { 
        $result =  null;  
    }  else  { 
        $result = $user->name;  
    }  
}

但是根据案例二中的解释并不会对auth()进行is_null检查,而是只会对user()user()->name进行is_null检查

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!