PHP   发布时间:2019-11-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 里就可以这么定义了: ...

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

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

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

php;"> 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 的设置:

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

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

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

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

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

php;"> function foo_default(Bar $bar = null) {} foo_default(new Bar); // valid foo_default(null); // valid foo_default(); // valid

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

php;"> function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // valid foo_nullable(null); // valid foo_nullable(); // INVALID!

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

php;"> public function setIssueAt(\datetiR_573_11845@e $issueAt = null)

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

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

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

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

php;"> 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程序设计有所帮助。

大佬总结

以上是大佬教程为你收集整理的PHP7.1新功能之Nullable Type用法分析全部内容,希望文章能够帮你解决PHP7.1新功能之Nullable Type用法分析所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。