PHP 7.1 新功能之 Nullable Type例子
发布:smiling 来源: PHP粉丝网 添加日期:2018-09-19 09:44:09 浏览: 评论:0
在 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);
- }
- }
Tags: 新功能 例子
- 上一篇:PHP7 新特性新功能有哪些?
- 下一篇:PHP代码优化24条真经
相关文章
- ·PHP7新功能使用教程详解(2018-09-14)
- ·PHP7 新特性新功能有哪些?(2018-09-19)
- ·PHP7新功能总结(2021-11-17)
- ·PHP7新特性foreach 修改使用例子(2018-09-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)