この構文をphpで使用するという考えがあります。オブジェクトを作成するためのさまざまなフォールバック方法があることを示しています
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
これは悪夢ですか?それともうまくいきますか?
それともうまくいきますか?
うまくいきません。コンストラクターで作成されているオブジェクトを設定解除したり、根本的に変更したりすることはできません。また、戻り値を設定することもできません。できることは、オブジェクトのプロパティを設定することだけです。
これを回避する 1 つの方法は、条件をチェックして次のように正しいオブジェクトの新しいインスタンスを返す別の「ファクトリ」クラスまたは関数を用意することです。
function factory() {
if(some_case())
return new class1();
else
return new class2();
}
以下も参照してください。
次のようなより一般的なことをしないのはなぜですか。
function __construct() {
if(some_case())
$this->construct1();
else
$this->construct2();
}
Singleton class patternに少し似ています。
ファクトリーメソッドが作れます。
例:
クラスA {} クラスB {} クラスC { function static getObject() { if(some_case()) 新しい A() を返します。 そうしないと 新しい B() を返します。 } } $ob = C::getObject();
クラスメソッド method1 と method2 を作成して、次のように書くだけです。
function __construct() {
if(some_case())
$this->method1();
else
$this->method2();
}
あなたがやろうとしているように見える正しい構文については、とりわけ@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
(注:静的メソッドでは絶対に使用できません)
一部の機能を共有したい場合は、次のようにします
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();