[精选] 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...
本作品采用《CC 协议》,转载必须注明作者和本文链接
对于空安全可能理解上有些出入:
例如在代码中使用到 $value = $param1?->$param2
1.空安全判断的是针对于$param1的判断,若$parma1为null则?->不管调用什么属性和方法$value值为null
2.而不是判断是否存在后面的属性或是方法
3.若$param1存在(不为空)但是不包含后续调用的属性或是方法仍然会报错
根据官方文档中的解释还有示例来看,这段是有问题的
官方文档:
示例:
在案例二中根据官方解释你的代码应该是等价于:
但是根据案例二中的解释并不会对
auth()
进行is_null
检查,而是只会对user()
和user()->name
进行is_null
检查