PHP7.1新功能之Nullable Type用法分析
本文实例分析了PHP7.1新功能之NullableType用法。分享给大家供大家参考,具体如下:
在PHP5时代,PHP的参数已经支持typehint(除了基本类型),想必大家应该很熟悉;后来PHP7时代来临,PHP也可以指定返回值的类型(以及基本类型的typehint)。但我们可能还有一种需求:除了指定的typehint,参数或者返回值也能定义可以为null,举个例子,假如我们有一个UserRepository类,有一个方法叫find($id),此方法可返回一个User对象,也可返回null,在PHP7.1里就可以这么定义了:
...
classUserRepository { ... publicfunctionfind($id):?User { ... return$user; //or //returnnull; } }
但这么申明以后,如果返回null,是否必须显式调用returnnull,这就得等7.1正式出来之后再验证了。
当然还有参数设定是否nullable的例子,直接复制官网里的例子:
functionsay(?string$msg){ if($msg){ echo$msg; } } say('hello');//ok--printshello say(null);//ok--doesnotprint say();//error--丢失属性 say(newstdclass);//error--类型错误
以上便是nullabletype的大致用法,但其实引入了此种机制以后,有很多细节都是需要注意的,比如在继承的时候,子类允许去掉父类同名方法的返回类型为nullable的设置:
interfaceFooable { publicfunctionfoo():?Fooable; } interfaceStrictFooableextendsFooable { publicfunctionfoo():Fooable;//valid }
但反过来,子类是不允许添加返回类型可以为nullable的。
然后我们再来看看参数类型的情况。跟返回类型相反,子类在复写父类方法时,参数类型是可以在父类参数的基础上添加nullable属性的:
interfaceFooable { publicfunctionfoo(Fooable$f); } interfaceLooseFooextendsFooable { functionfoo(?Fooable$f); }
反过来不行。可能刚看到这点,大家都会有疑问为什么返回类型和参数类型会有这样的设定。其实大家想想Liskov替换原则就明白了。
最后是关于参数默认值的问题,目前PHP是可以这样做的:
functionfoo_default(Bar$bar=null){} foo_default(newBar);//valid foo_default(null);//valid foo_default();//valid
但如果改成nullable的类型申明,即使传入的参数是null,也不能在调用的时候省略不写:
functionfoo_nullable(?Bar$bar){} foo_nullable(newBar);//valid foo_nullable(null);//valid foo_nullable();//INVALID!
由此可见nullable类型的目的是为了允许某个参数带类型而且可以为null,而默认值为null的参数就真的是想告诉大家某个参数的默认值是null。以前我们如果允许某些setter可以置空,写的代码总是觉得怪怪的:
publicfunctionsetIssueAt(\DateTime$issueAt=null)
觉得怪最大的原因我想是因为这样的一个setter居然可以不传参数!
这下好了,有了nullabletype,我们也就不会写那么别扭的代码了。
当然,nullabletype和=null是可以同时用的。这里就不写例子了,效果跟只用=null没有区别。
最后,还是继承:如果父类方法参数是nullable的,那么子类可以使用=null
interfaceContract { publicfunctionmethod(?Foo$foo):bool; } classImplementationimplementsContract { publicfunctionmethod(?Foo$foo=null):bool { returnis_null($foo); } }
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。