考虑以下简单的类构造函数。(请注意,我显然不包括引用的所有方法。
// 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。如果我正在加载现有用户,我可以立即访问她/他的信息)
如果错了,为什么?为什么这很糟糕?
您尝试执行的操作根本不起作用,构造函数无论如何都会返回User
的新实例,即使您尝试返回null
。
例如,这个:
class User {
function __construct() {
return null;
}
}
var_dump(new User());
将打印:
object(User)#1 (0) {
}
http://codepad.org/0IdJydkY
您可以向类添加静态方法来创建用户或返回 null
public static function createUser() {
// do your checks
// if valid return instance
// return null;
}
$user = User::createUser();
注意:您可能需要将authorized()
方法设为静态 - 取决于类的其余部分。
你的 __construct() 函数根本不应该返回任何值,它总是自动返回对象 - 它应该用于启动某些事情。
我建议将代码放在不同的函数中。
可以在此处阅读有关此内容的更多信息: 回声返回构造方法;