这篇文章主要介绍了PHP7.1新功能之Nullable Type用法,结合实例形式较为详细的对比分析了Nullable Type类型操作的使用,需要的朋友可以参考下

本文实例分析了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运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程总结》、《PHP数组(Array)操作大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作汇总》

希望本文所述对大家PHP程序设计有所帮助。

最新资讯
淘宝春晚数据:660亿次互动 清空购物车最高2.3万元

淘宝春晚数据:660亿次

除夕夜当晚,清空淘宝购物车的活动互动次数超过660亿次,
截至23点 快手春晚互动量437亿次超去年208亿次

截至23点 快手春晚互

截至24日23点,全球观众参与快手前三轮红包互动累计达43
遭美国防部反对 美商务部撤回美企对华为限制措施

遭美国防部反对 美商

华尔街日报援引消息人士称,因遭到美国防部和财政部反对
支付宝五福开奖超3亿人分5亿 大多分到1.68元

支付宝五福开奖超3亿

根据支付宝开奖信息显示,今年共有超过3亿人集齐了五福,3
斗鱼向武汉防疫一线捐款1000万 其总部位于武汉

斗鱼向武汉防疫一线捐

总部位于湖北武汉的斗鱼今日宣布向武汉防疫一线捐款10
途家升级退改政策 将为武汉医务人员提供免费住宿

途家升级退改政策 将

针对新型冠状病毒肺炎疫情,途家在推出民宿订单退改政策
最新文章
php求斐波那契数的两种实现方式【递归与递推】

php求斐波那契数的两

这篇文章主要介绍了php求斐波那契数的两种实现方式,结
浅析PHP7 的垃圾回收机制

浅析PHP7 的垃圾回收

垃圾回收机制是一种动态存储分配方案。它会自动释放程
PHP 模拟登陆功能实例详解

PHP 模拟登陆功能实例

这篇文章主要介绍了PHP 模拟登陆功能,结合实例形式详
Yii框架连表查询操作示例

Yii框架连表查询操作

这篇文章主要介绍了Yii框架连表查询操作,结合实例形式
mysqli扩展无法在PHP7下升级问题的解决

mysqli扩展无法在PHP7

这篇文章主要给大家介绍了关于mysqli扩展无法在PHP7下
php探针不显示内存解决方法

php探针不显示内存解

在本篇文章里小编给大家整理的是关于php探针不显示内