当前位置:首页 > 日记 > 正文

PHP7.1新功能之Nullable Type用法分析

PHP7.1新功能之Nullable Type用法分析

本文实例分析了PHP7.1新功能之Nullable Type用法。分享给大家供大家参考,具体如下:

在 PHP5 时代,PHP 的参数已经支持 type hint(除了基本类型),想必大家应该很熟悉;后来 PHP7 时代来临,PHP 也可以指定返回值的类型(以及基本类型的 type hint)。但我们可能还有一种需求:除了指定的 type hint,参数或者返回值也能定义可以为 null,举个例子,假如我们有一个 UserRepository 类,有一个方法叫 find($id),此方法可返回一个 User 对象,也可返回 null,在 PHP7.1 里就可以这么定义了:
...

class UserRepository{  ...  public function find($id): ?User  {    ...    return $user;    // or    // return null;  }}

但这么申明以后,如果返回 null,是否必须显式调用 return null,这就得等 7.1 正式出来之后再验证了。

当然还有参数设定是否 nullable 的例子,直接复制官网里的例子:

function say(?string $msg) {  if ($msg) {    echo $msg;  }}say('hello'); // ok -- prints hellosay(null); // ok -- does not printsay(); // error -- 丢失属性say(new stdclass); //error -- 类型错误

以上便是 nullable type 的大致用法,但其实引入了此种机制以后,有很多细节都是需要注意的,比如在继承的时候,子类允许去掉父类同名方法的返回类型为 nullable 的设置:

interface Fooable{  public function foo(): ?Fooable;}interface StrictFooable extends Fooable{  public function foo(): Fooable; // valid}

但反过来,子类是不允许添加返回类型可以为 nullable 的。

然后我们再来看看参数类型的情况。跟返回类型相反,子类在复写父类方法时,参数类型是可以在父类参数的基础上添加 nullable 属性的:

interface Fooable{  public function foo(Fooable $f);}interface LooseFoo extends Fooable{  function foo(?Fooable $f);}

反过来不行。可能刚看到这点,大家都会有疑问为什么返回类型和参数类型会有这样的设定。其实大家想想 Liskov 替换原则就明白了。
最后是关于参数默认值的问题,目前 PHP 是可以这样做的:

function foo_default(Bar $bar = null) {}foo_default(new Bar); // validfoo_default(null); // validfoo_default(); // valid

但如果改成 nullable 的类型申明,即使传入的参数是 null,也不能在调用的时候省略不写:

function foo_nullable(?Bar $bar) {}foo_nullable(new Bar); // validfoo_nullable(null); // validfoo_nullable(); // INVALID!

由此可见 nullable 类型的目的是为了允许某个参数带类型而且可以为 null,而默认值为 null 的参数就真的是想告诉大家某个参数的默认值是 null。以前我们如果允许某些 setter 可以置空,写的代码总是觉得怪怪的:

public function setIssueAt(\DateTime $issueAt = null)

觉得怪最大的原因我想是因为这样的一个 setter 居然可以不传参数!

这下好了,有了 nullable type,我们也就不会写那么别扭的代码了。

当然,nullable type 和 = null 是可以同时用的。这里就不写例子了,效果跟只用 = null 没有区别。

最后,还是继承:如果父类方法参数是 nullable 的,那么子类可以使用 = null

interface Contract{  public function method(?Foo $foo): bool;}class Implementation implements Contract{  public function method(?Foo $foo = null): bool  {    return is_null($foo);  }}

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

在EXCEL中设置各种不同字体的方法

在EXCEL中设置各种不同字体的方法

设置,方法,字体,电脑软件,EXCEL,在EXCEL中设置各种不同字体的方法 方法/步骤1、首先打开EXCEL2003表.如下图所示:2、选择已经建立的表格,如下图所示: 3、选中你所需要设置的表格区域,点击田字型样式旁边的倒三角键头。如下图所示:4、然后会出现…

最幽默个性签名的经典搞笑个性签名

最幽默个性签名的经典搞笑个性签名

个性签名,幽默,搞笑,经典,电脑软件,事实上,你有优势。鬼魂不敢跑到你家过夜。下面是一个小编辑,组织最幽默的个人签名的相关资料供你参考! 最幽默的人格签名{优秀文本} 1。爱情是对天地的迷信。 2。也许心碎是最美的爱。 三.爱情就像一起旅…

如何设置时间和日期PPT2010制作同

如何设置时间和日期PPT2010制作同

日期,如何设置,同步显示,时间,电脑软件,如何在PPT中插入时间并同步更新创建幻灯片幻灯片时,需要插入当前时间和日期。如果是手动输入,它只是一串数字,不能实现同步更新。让我们在PPT中分享插入时间和同步更新的方法。不懂的朋友会学到更多。 …

ES6入门教程之let和const命令详解

ES6入门教程之let和const命令详解

命令详解,入门教程,电脑软件,const,前言在javascript中,我们都知道使用var来声明变量。javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量。函数级作用域会导致一些问题就是某些代码块内的变量会在全局范围内…

如何在PPT中制作文字动画效果

如何在PPT中制作文字动画效果

动画效果,文字,如何在,电脑软件,PPT,  为什么别人的PPT就制作的那么好看呢?其实没有什么不同的,只是我们不会用PPT而已。现在很多幻灯片中都会选择文字动画效果,立马给人很高大上的感觉。以下是小编为您带来的关于PPT制作文字动画效果,希望…

ORACLE自动备份控制文件的方法介绍

ORACLE自动备份控制文件的方法介绍

自动备份,方法,控制文件,电脑软件,ORACLE,RMAN(Recovery Manager)是一个用于备份Oracle工具(备份),恢复(恢复)和恢复(恢复)databases.rman只能用于Oracle8或更高版本。它可以备份整个数据库或数据库组件,如表空间,数据文件,控制文件,归档文件,并为参数fil…

Illustrator简单绘制一个可爱的小

Illustrator简单绘制一个可爱的小

图标,绘制,饼干,可爱,简单,今天为大家分享Illustrator简单绘制一个可爱的小饼干图标方法介绍,操作很简单,也很基础,喜欢的朋友可以跟着这篇教程进行操作,希望能对大家有所帮助!步骤:教程结束,以上就是Illustrator简单绘制一个可爱的小饼干图标教程…

InDesign字符集基线偏移、旋转和间

InDesign字符集基线偏移、旋转和间

字符集,基线,间距,电脑软件,InDesign,以通用符号的字符特征为例,介绍了字符基线偏移、旋转和距离的设置方法。 步: 1、拖动鼠标选择风字。 2、按Ctrl + T组合键打开字符面板;;,基线偏移;输入- 3按下{Enter}键,然后输入字符旋转15按下{Enter}键。…

Word2016文档裁剪图形的方法是什么

Word2016文档裁剪图形的方法是什么

文档,方法,图形,电脑软件,  我们向Word中插入图片之后,有时候会因为图片的大小或者只想保留图片某些部分而对图片进行裁剪,相比于早期的版本Word2016中的裁剪更为强大和好用。以下是小编为您带来的关于Word2016裁剪图形的方法,希望对您有所…

基于Node.js的WebSocket通信实现

基于Node.js的WebSocket通信实现

电脑软件,Node,js,WebSocket,node的依赖包node中实现Websocket的依赖包有很多,websocket、ws均可,本文选取ws来实现,首先安装依赖npm install ws聊天室实例假如A,B,C,D用户均通过客户端连接到Websocket服务,其中每个人发的消息都需要将其通过We…

PHP基于关联数组20行代码搞定约瑟

PHP基于关联数组20行代码搞定约瑟

数组,约瑟夫,示例,代码,电脑软件,本文实例讲述了PHP基于关联数组20行代码搞定约瑟夫问题。分享给大家供大家参考,具体如下:记得前段时间一写做java开发的兄弟对我说他java60行做了个约瑟夫问题,挺不错的。调侃php应该写这个挺不行的。于是 呵…

详解vuex 中的 state 在组件中如何

详解vuex 中的 state 在组件中如何

组件,详解,电脑软件,state,vuex,前言不知道大家有没有遇到过这样一种情况? vuex中的state会在某一个组建中使用,而这个状态的初始化是通过异步加载完成的。组件在渲染过程中,获取的state状态为空。也就是说组件在异步完成之前就已经完成渲染了…