2012-05-12 4 views
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; 
    } 
} 

私の質問はこれです:?ここで間違った値を返す私の方法がある私の友人は、コンストラクタは、常にNO MATTER WHATオブジェクトを返すべきではないと主張しています。しかし、私がここにレイアウトしたやり方ははるかに簡単で、作業がはるかに簡単です(新しいユーザーを作成する場合は、バットからIDを取得します)。それが間違っている場合は、すぐに)

を彼女/彼の情報へのアクセスを持っていることは、なぜ?なぜこの悪い?

+1

"常に、何に関係なく" ... – Jon

+1

PHPでは、戻り値は効果がありません。 http://stackoverflow.com/questions/2214724/php-constructor-to-return-a-null –

+2

あなたのお友達のアドバイスは多分異なる言葉から来ているでしょう。 –

答えて

8

あなたは、単に動作しない何をしようとして、コンストラクタあなたがnullを返すようにしようとした場合でも、とにかくUserの新しいインスタンスを返します。 。

たとえば、この:

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

が印刷されます:

object(User)#1 (0) { 
} 

http://codepad.org/0IdJydkY

+0

オブジェクトはすでにこの時点で作成されており、 '__construct()'は作成時にオブジェクトのプロパティを変更するためのものです。 'new'で呼び出されると、このコンストラクタの戻り値は単に無視されます。しかし、 '$ obj - > __ construct($ user_id)'を実行することができます。これは、OPの場合に '$ new_user'の値を返します。しかし、 '$ obj - > __ construct($ user_id)'を試みるのは悪いことです。ものすごく悪い。決して直接コンストラクタメソッドを呼び出さないでください。 –

+0

@ bob-the-destroyer私は '$ obj - > __ construct($ user_id)'を直接使用することは考えていませんでした。非常に、本当に非常に悪い!初心者の方は、 '__construct'は(すでに' new ClassName() 'で一度実行されているので)、もう一度実行します。 – bfavaretto

+0

右。通常、クラスの外部からPHPの「マジックメソッド」を呼び出すことはできますが、一般的には使用されず、生産性もありません。 "アンチパターン"より悪い。 OPの場合、これは非常に「間違っている」。 OPのよりよい修正は、オブジェクトまたはnullを返すハンドラ/ラッパー関数を呼び出すことです。 –

0

あなたの__construct()関数shouldnでありますすべての値を返すわけではなく、常に自動的にオブジェクトを返します。これは、特定のものを開始するために使用する必要があります。

コードを別の機能にすることをおすすめします。

この上

詳細はここで読むことができます:Echo Return construct method;

2

をあなたはユーザーを作成するためにあなたのクラスに静的メソッドを追加することができ、またはnull

を返すために、
public static function createUser() { 
    // do your checks 
    // if valid return instance 
    // return null; 
} 

$user = User::createUser(); 

注:あなたのauthorized()メソッドを静的にする必要があるかもしれません - あなたのクラスの残りの部分に依存します。

+1

パターン工場、そうですか?私はそれが正しいと思う –

関連する問題