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

Com*_*fox 16 php type-hinting php-7 php-7.1

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

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

此映射器类需要检查对象是否已存在于db中,并通过检查是否已设置id来执行此操作:

if(empty($exampleObject->getId())) {
    // Insert object
} else {
    // Update object
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 在getter中抛出异常,并在mapper类中设计检查,以便捕获该异常.
  • 捕获TypeError异常,并使用它来指示未设置id.
  • 将id属性设为public,因此我可以直接调用isset.
  • 添加不同的方法 hasId() return isset($this->id)

坦率地说,不喜欢任何这些解决方案,我想知道是否有更好的选择.对于这样的案例,最佳做法是什么?

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

And*_*rea 26

PHP 7.1添加了可空类型,在类型名称前面加上一个问号,将返回类型标记为接受该类型和null:

public function getId(): ?int {
    /* … */
}
Run Code Online (Sandbox Code Playgroud)

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