我有一個在php中使用這種語法的想法。它說明有不同的回退方式來創建對象
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
這是一場噩夢嗎?或者它有效?
我有一個在php中使用這種語法的想法。它說明有不同的回退方式來創建對象
function __construct() {
if(some_case())
$this = method1();
else
$this = method2();
}
這是一場噩夢嗎?或者它有效?
或者它有效嗎?
它不起作用。您無法取消設置或從根本上更改構造函數中正在創建的對象。您也可以不設置返回值。你所能做的就是設置對象的屬性。要解決這個問題
一種方法是有一個單獨的「工廠」類或函數,來檢查病情,並返回正確的對象,像這樣一個新的實例:
function factory() {
if(some_case())
return new class1();
else
return new class2();
}
參見:
爲什麼不能做一些比較常見的,如:
function __construct() {
if(some_case())
$this->construct1();
else
$this->construct2();
}
您可以只創建類的方法方法1和method2和只寫
function __construct() {
if(some_case())
$this->method1();
else
$this->method2();
}
這聽起來像Singleton class pattern一點點。
您可以製造工廠方法。
例子:
class A {} class B {} class C { function static getObject() { if(some_case()) return new A(); else return new B(); } } $ob = C::getObject();
見@伊萬等回答正確的語法是什麼樣子,你正在試圖做的。
不過,也有另外一種選擇 - 使用一個靜態的方法代替構造函數:
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();
雖然應該是一個靜態方法。 – BoltClock 2011-02-18 16:18:32