1

考虑以下简单的类构造函数。(请注意,我显然不包括所有引用的方法。

// Initialize User class.
public function __construct($user_id = NULL)
{
    // If user is loaded (and a user ID is provided)
    if ($user_id)
    {
        // If user is authorized.
        if ($this->authorized($user_id))
        {
            // Load user information.
            $this->info = $this->load($user_id);
        }
        else
        {
            // Return an empty (nonexistent) user.
            return NULL;
        }
    }

    // If user is loaded (and no user ID is provided)
    else
    {
        // Create a new user.
        $new_user = create_user();

        // Return the new user's ID.
        return $new_user;
    }
}

我的问题是:我在这里返回值的方法是错误的吗?我的朋友坚持认为构造函数应该总是返回一个对象,不管是什么。但是,我在此处布置的方式似乎要简单得多,并且更易于使用。(如果我正在创建一个新用户,那么我会立即获得他的 ID。如果我正在加载一个现有用户,我会立即访问她/他的信息)

如果是错的,为什么?为什么这很糟糕?

4

3 回答 3

8

您尝试做的事情根本行不通,构造函数无论如何都会返回的新实例User,即使您尝试 return null

例如,这个:

class User {
  function __construct() {
    return null;
  }
}
var_dump(new User());

将打印:

object(User)#1 (0) {
}

http://codepad.org/0IdJydkY

于 2012-05-12T21:11:42.103 回答
2

您可以向您的类添加一个静态方法来创建用户或返回 null

public static function createUser() {
    // do your checks
    // if valid return instance
    // return null;
}

$user = User::createUser();

注意:您可能必须使您的authorized()方法静态 - 取决于您的类的其余部分。

于 2012-05-12T21:16:17.910 回答
0

您的 __construct() 函数根本不应该返回任何值,它总是自动返回对象 - 它应该用于启动某些事情。

我建议将代码放在不同的函数中。

更多信息可以在这里阅读:Echo Return 构造方法;

于 2012-05-12T21:10:57.963 回答