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


Posted in PHP onSeptember 26, 2016

本文实例分析了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 hello
say(null); // ok -- does not print
say(); // 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); // valid
foo_default(null); // valid
foo_default(); // valid

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

function foo_nullable(?Bar $bar) {}
foo_nullable(new Bar); // valid
foo_nullable(null); // valid
foo_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+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
php创建基本身份认证站点的方法详解
Jun 08 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
php将金额数字转化为中文大写
Jul 09 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 #PHP
php版交通银行网银支付接口开发入门教程
Sep 26 #PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 #PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 #PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 #PHP
PHP弱类型的安全问题详细总结
Sep 25 #PHP
php中mkdir()函数的权限问题分析
Sep 24 #PHP
You might like
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
Python中操作文件之write()方法的使用教程
2015/05/25 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
python实现简易通讯录修改版
2018/03/13 Python
python list格式数据excel导出方法
2018/10/31 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
土木工程毕业生自荐信
2013/11/12 职场文书
五一劳动节活动记录
2014/03/23 职场文书
土建技术员岗位职责
2015/04/11 职场文书
小学体育课教学反思
2016/02/16 职场文书