返回带有返回类型声明的NULL

时间:2016-02-02 20:41:19

标签: php php-7 type-hinting php-7.1

当我遇到问题时,我正在重构一个用于PHP7的代码库,特别是实现标量类型提示和返回类型提示。

我有一个包含一些属性的类,其中一个是id。此id不是必需的(您可以在不设置ID的情况下构造对象)。创建此类的新对象时,不要设置id,只要将其插入db(通过单独的映射器类),它就会获得id。

这个mapper类需要检查数据库中是否已存在该对象,并通过检查是否设置了id来执行此操作:

if(empty($exampleObject->getId())) {
    // Insert object
} else {
    // Update object
}

我正在将返回类型提示应用于我的代码库中的每个函数,问题是函数getId()如果强制执行 int 则无法返回 NULL em>返回类型。 It TypeErrors,即使没有启用严格的输入:

  

致命错误:未捕获TypeError:ExampleClass :: getId()的返回值必须是integer类型,返回null

我认为没有为此getter设置返回类型提示,但我意识到问题可能不是返回类型提示,而是我使用混合返回类型的事实。我记得在某处读过使用混合返回类型是一件坏事,但我不知道如何在不使用混合返回类型的情况下解决这个问题。我可以:

  • 在getter中抛出异常,并在mapper类中设计检查,以便捕获该异常。
  • 捕获TypeError异常,并使用它来指示未设置id。
  • 将id属性设为public,因此我可以直接调用 isset
  • 添加其他方法hasId() return isset($this->id)
坦率地说,不要真的喜欢这些解决方案,我想知道是否有更好的选择。对于这样的案例,最佳做法是什么?

另外,如果我启用了严格的输入,我不应该只获得TypeError吗?我认为PHP7默认为“弱类型提示”。

2 个答案:

答案 0 :(得分:24)

PHP 7.1添加了nullable types,您在类型名称前加上一个问号,将返回类型标记为同时接受该类型和null:

public function getId(): ?int {
    /* … */
}

如果您仍然使用PHP 7.0,我建议省略类型声明并使用docblock。

答案 1 :(得分:0)

使用null意味着使用面向对象的方法,因为值类型不能为null。因此,在整数类型周围使用类包装器可能很有用。例如,来自SPL类型的SplInt