2016-12-29 115 views
1

我不确定这样做的最有效方法是什么,但我认为最好有一个返回一个数据类型的函数,不管它是布尔型还是字符串,但是在某些情况下,我可以看到实现这样一个严格的规则是多么困难,例如,如果找到数据库记录,下面的代码将返回一个对象,否则它将返回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; 
    } 
} 

我的问题是在这种情况下推荐的最佳实践是什么?

回答

1

它取决于上下文和您的喜好

对于标量类型和数组,您有某个默认值,例如0,空字符串,空数组等。当默认值是常规结果时,可以使用故意错误的东西。例如,当找不到子字符串时,JavaScript中的indexOf返回-1。但在这种情况下,PHP的strpos()返回false

对于物体,null(不是false通常使用作为它们的缺席。在一些严格类型的语言(C#,Java)中,所有的对象引用都是可空的:当方法可以返回一个对象时,它也可以返回一个null。但是这种方法也可能会导致很多问题。他们可以通过Null Object模式在某些情况下避免。

此外,PHP 7.1提供了一个nullable type notation

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; 
}