5

この構文をphpで使用するという考えがあります。オブジェクトを作成するためのさまざまなフォールバック方法があることを示しています

function __construct() {

   if(some_case())
      $this = method1();
   else
      $this = method2();

}

これは悪夢ですか?それともうまくいきますか?

4

7 に答える 7

14

それともうまくいきますか?

うまくいきません。コンストラクターで作成されているオブジェクトを設定解除したり、根本的に変更したりすることはできません。また、戻り値を設定することもできません。できることは、オブジェクトのプロパティを設定することだけです。

これを回避する 1 つの方法は、条件をチェックして次のように正しいオブジェクトの新しいインスタンスを返す別の「ファクトリ」クラスまたは関数を用意することです。

function factory() {

   if(some_case())
      return new class1();
  else
      return new class2();

}

以下も参照してください。

于 2011-02-18T16:03:18.490 に答える
4

次のようなより一般的なことをしないのはなぜですか。

function __construct() {

   if(some_case())
      $this->construct1();
   else
      $this->construct2();
}
于 2011-02-18T16:03:47.347 に答える
1

Singleton class patternに少し似ています。

于 2011-02-18T16:06:21.217 に答える
1

ファクトリーメソッドが作れます。

例:

クラスA {}
クラスB {}

クラスC {
   function static getObject() {
      if(some_case())
         新しい A() を返します。
      そうしないと
          新しい B() を返します。
   }
}

$ob = C::getObject();
于 2011-02-18T16:06:36.340 に答える
1

クラスメソッド method1 と method2 を作成して、次のように書くだけです。

function __construct() {

   if(some_case())
      $this->method1();
   else
      $this->method2();

}
于 2011-02-18T16:04:57.627 に答える
0

あなたがやろうとしているように見える正しい構文については、とりわけ@Ivanの返信を参照してください。

ただし、別の代替手段があります-代替コンストラクターとして静的メソッドを使用します。

class myclass {
     function __construct() { /* normal setup stuff here */}

     public static function AlternativeConstructor() {
         $obj = new myclass; //this will run the normal __construct() code
         $obj->somevar = 54; //special case in this constructor.
         return $obj;
     }

}

...

//this is how you would use the alternative constructor.
$myobject = myclass::AlternativeConstructor();

$this(注:静的メソッドでは絶対に使用できません)

于 2011-02-18T16:09:22.397 に答える
-1

一部の機能を共有したい場合は、次のようにします

class base{
    'your class'
}

class A extends base{
    'your class'
}

class B extends base{
    'your class'
}

そして、次のように呼び出します

if(some_case())
    $obj = new A();
else
    $obj = new B();
于 2014-06-18T14:04:35.043 に答える