2011-02-18 143 views
3

我有一個在php中使用這種語法的想法。它說明有不同的回退方式來創建對象

function __construct() { 

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

} 

這是一場噩夢嗎?或者它有效?

回答

13

或者它有效嗎?

它不起作用。您無法取消設置或從根本上更改構造函數中正在創建的對象。您也可以不設置返回值。你所能做的就是設置對象的屬性。要解決這個問題

一種方法是有一個單獨的「工廠」類或函數,來檢查病情,並返回正確的對象,像這樣一個新的實例:

function factory() { 

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

} 

參見:

+2

雖然應該是一個靜態方法。 – BoltClock 2011-02-18 16:18:32

4

爲什麼不能做一些比較常見的,如:

function __construct() { 

    if(some_case()) 
     $this->construct1(); 
    else 
     $this->construct2(); 
} 
1

您可以只創建類的方法方法1和method2和只寫

function __construct() { 

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

} 
1

您可以製造工廠方法。

例子:

 
class A {} 
class B {} 

class C { 
    function static getObject() { 
     if(some_case()) 
     return new A(); 
     else 
      return new B(); 
    } 
} 

$ob = C::getObject(); 
0

見@伊萬等回答正確的語法是什麼樣子,你正在試圖做的。

不過,也有另外一種選擇 - 使用一個靜態的方法代替構造函數:

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

-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();