当我遇到问题时,我正在重构一个用于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设置返回类型提示,但我意识到问题可能不是返回类型提示,而是我使用混合返回类型的事实。我记得在某处读过使用混合返回类型是一件坏事,但我不知道如何在不使用混合返回类型的情况下解决这个问题。我可以:
hasId() return isset($this->id)
另外,如果我启用了严格的输入,我不应该只获得TypeError吗?我认为PHP7默认为“弱类型提示”。
答案 0 :(得分:24)
PHP 7.1添加了nullable types,您在类型名称前加上一个问号,将返回类型标记为同时接受该类型和null:
public function getId(): ?int {
/* … */
}
如果您仍然使用PHP 7.0,我建议省略类型声明并使用docblock。
答案 1 :(得分:0)
使用null
意味着使用面向对象的方法,因为值类型不能为null。因此,在整数类型周围使用类包装器可能很有用。例如,来自SPL类型的SplInt。