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、を返そうとしても、とにかくの新しいインスタンスを返し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()関数は値をまったく返さないようにする必要があります。常にオブジェクトを自動的に返します。これは、特定のことを開始するために使用する必要があります。

コードを別の関数に配置することをお勧めします。

これについての詳細はここで読むことができます:EchoReturn構文メソッド。

于 2012-05-12T21:10:57.963 に答える