使用 return 类型声明返回 NULL
Returning NULL with return type declarations
当我遇到问题时,我正在重构用于 PHP7 的代码库,特别是实现标量类型提示和 return 类型提示。
我有一个 class 有一些属性,其中之一是一个 id。这个 id 不是强制的(你可以构造一个对象而不设置 id)。当创建这个 class 的新对象时,您不设置 id,它会在插入数据库后立即获得一个 id(通过单独的映射器 class)。
这个映射器 class 需要检查对象是否已经存在于数据库中,它通过检查是否设置了 id 来做到这一点:
if(empty($exampleObject->getId())) {
// Insert object
} else {
// Update object
}
我正在对代码库中的每个函数应用 return 类型提示,问题是函数 getId()
不能 return NULL 如果我强制执行 int return 类型。 TypeErrors,即使没有启用严格类型:
Fatal error: Uncaught TypeError: Return value of ExampleClass::getId() must be of the type integer, null returned
我考虑过不为此 getter 设置 return 类型提示,但后来我意识到问题可能不是 return 类型提示,而是我使用混合 return 类型。我记得在某处读到使用混合 return 类型是一件坏事,但我不确定如何在不使用混合 return 类型的情况下解决这个问题。我可以:
- 在 getter 中抛出一个异常,并在映射器 class 中设计检查以捕获该异常。
- 捕获 TypeError 异常,并用它来指示未设置 id。
- 设置 id 属性 public,这样我就可以直接调用 isset。
- 添加不同的方法
hasId() return isset($this->id)
坦率地说,我不太喜欢这些解决方案中的任何一个,我想知道是否有更好的选择。对于这种情况,最佳做法是什么?
此外,如果我启用了严格输入,难道我不应该只得到一个 TypeError 吗?我以为 PHP7 默认为 "weak type hints".
使用null
意味着使用面向对象的方法,因为值类型不能为空。因此,对整数类型使用 class 包装器可能很有用。例如,来自 SPL 类型的 SplInt。
PHP 7.1 添加了 nullable types,在类型名称前放置一个问号以将 return 类型标记为接受该类型和 null:
public function getId(): ?int {
/* … */
}
如果您仍在使用 PHP 7.0,我建议您省略类型声明并使用文档块。
当我遇到问题时,我正在重构用于 PHP7 的代码库,特别是实现标量类型提示和 return 类型提示。
我有一个 class 有一些属性,其中之一是一个 id。这个 id 不是强制的(你可以构造一个对象而不设置 id)。当创建这个 class 的新对象时,您不设置 id,它会在插入数据库后立即获得一个 id(通过单独的映射器 class)。
这个映射器 class 需要检查对象是否已经存在于数据库中,它通过检查是否设置了 id 来做到这一点:
if(empty($exampleObject->getId())) {
// Insert object
} else {
// Update object
}
我正在对代码库中的每个函数应用 return 类型提示,问题是函数 getId()
不能 return NULL 如果我强制执行 int return 类型。 TypeErrors,即使没有启用严格类型:
Fatal error: Uncaught TypeError: Return value of ExampleClass::getId() must be of the type integer, null returned
我考虑过不为此 getter 设置 return 类型提示,但后来我意识到问题可能不是 return 类型提示,而是我使用混合 return 类型。我记得在某处读到使用混合 return 类型是一件坏事,但我不确定如何在不使用混合 return 类型的情况下解决这个问题。我可以:
- 在 getter 中抛出一个异常,并在映射器 class 中设计检查以捕获该异常。
- 捕获 TypeError 异常,并用它来指示未设置 id。
- 设置 id 属性 public,这样我就可以直接调用 isset。
- 添加不同的方法
hasId() return isset($this->id)
坦率地说,我不太喜欢这些解决方案中的任何一个,我想知道是否有更好的选择。对于这种情况,最佳做法是什么?
此外,如果我启用了严格输入,难道我不应该只得到一个 TypeError 吗?我以为 PHP7 默认为 "weak type hints".
使用null
意味着使用面向对象的方法,因为值类型不能为空。因此,对整数类型使用 class 包装器可能很有用。例如,来自 SPL 类型的 SplInt。
PHP 7.1 添加了 nullable types,在类型名称前放置一个问号以将 return 类型标记为接受该类型和 null:
public function getId(): ?int {
/* … */
}
如果您仍在使用 PHP 7.0,我建议您省略类型声明并使用文档块。