我不确定最有效的方法是什么,但我相信最好有一个返回一种数据类型的函数,无论是布尔值还是字符串,但在某些情况下我可以看到有多难它将是实现这样一个严格的规则,例如,如果找到数据库记录,下面的代码将返回一个对象,否则它将返回false。
public function get()
{
$record = $this->db->query('select id, first_name, last_name from users where id = :id', ['id' => 1]);
if ($record) {
return new User($record['id'], $record['first_name'], $record['last_name']);
} else {
return false;
}
}
我的问题是在这种情况下推荐的最佳做法是什么?
答案 0 :(得分:1)
取决于的背景和偏好。
对于标量类型和数组,您有一个默认值,如0,空字符串,空数组等。当默认值是常规结果时,您可以使用故意错误的内容。例如,当找不到子字符串时,JavaScript中的Qtcreator会返回-1
。但在这种情况下,PHP的indexOf
会返回false
。
对于对象,null
(不是false
)通常用作缺席对象。在一些严格类型的语言(C#,Java)中,所有对象引用都是可空的:当方法可以返回一个对象时,它也可以返回null
。但这种方法也可能导致很多问题。在某些情况下,可能会使用strpos()
模式来避免使用。
此外,PHP 7.1提供了Null Object:
function foo(): ?int
{
return null; // ok
}
最后,您可以在没有值时抛出异常。例如,在Python方法dict.get()
中,当请求的密钥不在字典中时,会引发KeyError
。
如您所见,不同的语言和API使用不同的方式,没有共同的正确答案。
我个人对你的例子的建议是按行为分离方法:
// Get-method should always return a value
function getObject(): ObjectClass
{
// ...obtain the $object;
if (!$object) {
throw new Exception();
}
return $object;
}
// Find-method can return value or NULL.
function findObject(): ?ObjectClass
{
// ...obtain the $object
return $object ?: null;
}