PHP7.1新功能之Nullable Type用法分析
php  /  管理员 发布于 7年前   190
本文实例分析了PHP7.1新功能之Nullable Type用法。分享给大家供大家参考,具体如下: 在 PHP5 时代,PHP 的参数已经支持 type hint(除了基本类型),想必大家应该很熟悉;后来 PHP7 时代来临,PHP 也可以指定返回值的类型(以及基本类型的 type hint)。但我们可能还有一种需求:除了指定的 type hint,参数或者返回值也能定义可以为 null,举个例子,假如我们有一个 UserRepository 类,有一个方法叫 find($id),此方法可返回一个 User 对象,也可返回 null,在 PHP7.1 里就可以这么定义了: 但这么申明以后,如果返回 null,是否必须显式调用 return null,这就得等 7.1 正式出来之后再验证了。 当然还有参数设定是否 nullable 的例子,直接复制官网里的例子: 以上便是 nullable type 的大致用法,但其实引入了此种机制以后,有很多细节都是需要注意的,比如在继承的时候,子类允许去掉父类同名方法的返回类型为 nullable 的设置: 但反过来,子类是不允许添加返回类型可以为 nullable 的。 然后我们再来看看参数类型的情况。跟返回类型相反,子类在复写父类方法时,参数类型是可以在父类参数的基础上添加 nullable 属性的: 反过来不行。可能刚看到这点,大家都会有疑问为什么返回类型和参数类型会有这样的设定。其实大家想想 Liskov 替换原则就明白了。 但如果改成 nullable 的类型申明,即使传入的参数是 null,也不能在调用的时候省略不写: 由此可见 nullable 类型的目的是为了允许某个参数带类型而且可以为 null,而默认值为 null 的参数就真的是想告诉大家某个参数的默认值是 null。以前我们如果允许某些 setter 可以置空,写的代码总是觉得怪怪的: 觉得怪最大的原因我想是因为这样的一个 setter 居然可以不传参数! 这下好了,有了 nullable type,我们也就不会写那么别扭的代码了。 当然,nullable type 和 = null 是可以同时用的。这里就不写例子了,效果跟只用 = null 没有区别。 最后,还是继承:如果父类方法参数是 nullable 的,那么子类可以使用 = null 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。
...class UserRepository{ ... public function find($id): ?User { ... return $user; // or // return null; }}
function say(?string $msg) { if ($msg) { echo $msg; }}say('hello'); // ok -- prints hellosay(null); // ok -- does not printsay(); // error -- 丢失属性say(new stdclass); //error -- 类型错误
interface Fooable{ public function foo(): ?Fooable;}interface StrictFooable extends Fooable{ public function foo(): Fooable; // valid}
interface Fooable{ public function foo(Fooable $f);}interface LooseFoo extends Fooable{ function foo(?Fooable $f);}
最后是关于参数默认值的问题,目前 PHP 是可以这样做的:function foo_default(Bar $bar = null) {}foo_default(new Bar); // validfoo_default(null); // validfoo_default(); // valid
function foo_nullable(?Bar $bar) {}foo_nullable(new Bar); // validfoo_nullable(null); // validfoo_nullable(); // INVALID!
public function setIssueAt(\DateTime $issueAt = null)
interface Contract{ public function method(?Foo $foo): bool;}class Implementation implements Contract{ public function method(?Foo $foo = null): bool { return is_null($foo); }}
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号