使用返回类型声明返回 NULL
2016-02-02
11085
我当时正在重构代码库以用于 PHP7,特别是实现标量类型提示和返回类型提示,这时我遇到了一个问题。
我有一个类,它有一些属性,其中一个是 id。此 id 不是强制性的(您可以在不设置 id 的情况下构造对象)。创建此类的新对象时,您无需设置 id,它会在插入数据库(通过单独的映射器类)后立即获得 id。
此映射器类需要检查对象是否已存在于数据库中,它通过检查 id 是否已设置来完成此操作:
if(empty($exampleObject->getId())) {
// Insert object
} else {
// Update object
}
我将返回类型提示应用于代码库中的每个函数,问题是,如果我强制使用
int
返回类型,函数
getId()
无法返回
NULL
。即使没有启用严格类型,它也会引发 TypeErrors:
Fatal error : Uncaught TypeError: Return value of ExampleClass::getId() must be of the type integer, null returned
我考虑过不为这个 getter 设置返回类型提示,但后来我意识到问题可能不是返回类型提示,而是我使用了混合返回类型。我记得在某处读到过使用混合返回类型是一件坏事,但我不确定如何在不使用混合返回类型的情况下解决这个问题。我可以:
- 在 getter 中抛出异常,并在映射器类中设计检查,以便它捕获该异常。
- 捕获 TypeError 异常,并使用它来指示未设置 id。
- 将 id 属性设为公共,这样我就可以直接在其上调用 isset 。
-
添加不同的方法
hasId() return isset($this->id)
坦率地说,我真的不喜欢这些解决方案中的任何一个,我想知道是否有更好的选择。对于这种情况,最佳做法是什么?
此外,如果我启用了严格类型,难道不应该只收到 TypeError 吗?我以为 PHP7 默认为“弱类型提示”。