2

我有一个创建用户类对象的方法,但是如果找不到用户,我需要返回一些东西,但我不确定是什么:

function getUserById($id)
{
    $sth = $this->db->prepare("SELECT id, username, password, salt, email, created, last_active FROM users WHERE id = ?");
    $sth->execute(array($id));

    $sth->setFetchMode(PDO::FETCH_OBJ);

    if ($sth->rowCount() == 0) {
        //return what?
    }

    $row = $sth->fetch();
    $user = new User($row);

    return $user;
}

该方法应该像这样使用:

$user = $user_mapper->getUserById($id);

问题是如果找不到用户我应该如何处理?我应该使用 try catch 块然后在 rowCount == 0 if 语句中抛出异常,还是在将 $user 变量设置为对象时只返回 false 并使用 if 语句?

4

3 回答 3

5

这完全取决于您和您的错误处理理念。

我会根据以下因素做出决定:这是一个特殊的事件吗?这永远不会发生吗?
如果答案是肯定的,则抛出异常。如果答案是这可能会发生,我只需要处理这种情况return false

于 2012-04-27T09:28:40.037 回答
1

我会返回空值。这个函数有一个单一的职责:尝试根据它的 id 找到一个用户。如果它没有找到,那么它没有找到,而“null”正是如此。在那之后,应该是调用这个函数的代码来处理这个问题。

现在,由于您是通过 id 而不是登录名/密码来查找用户,因此您还应该抛出一个异常:因为您的应用程序中的某个地方可能有问题:如果您有一个 id,它应该链接到数据库中的某些东西。

于 2012-04-27T09:35:03.407 回答
0

我建议添加一个自定义异常处理程序,因为您可以使用一致的日志记录方法或反馈给用户的方法,这些方法可以通过一个函数进行管理。有关一些指导,请参阅http://php.net/manual/en/function.set-error-handler.php

因此,在抛出异常时,请尝试描述性。您还可以使用它debug_backtrace来找出触发异常时的执行状态。请参阅http://www.php.net/manual/en/function.debug-backtrace.php

于 2012-04-27T09:28:47.617 回答