2012-09-11 61 views
2

我是PHP編程新手,正在嘗試做一個基本的工廠模式。我正在嘗試使用方法創建一個類實例,並使用構造函數。在PHP中使用工廠模式創建對象

$ abstract class Car { 
    public $type; 
    public function getType(){ 
    echo $this->type; 
    } 
    } 

//Class that holds all the details on how to make a Honda. 
class Honda extends Car{ 
     public $type = "Honda"; 
    } 

class CarFactory { 
    const HONDA = "Honda"; 
    public function __construct($carType){ 
    switch($carType){ 
     case self::HONDA: 
      return new Honda(); 
      break; 
    } 
    die("Car isn't recognized."); 
    } 

} 

$Honda = new CarFactory(carFactory::HONDA); 
var_dump($Honda); 

結果是CarFactory類的一個對象。爲什麼它不創建Honda類型的對象,因爲返回類型是Honda類型的對象?是因爲我正在使用構造函數嗎?

然而,如果使用的方法內CarFactory如下,它預先創建類型的對象本田

class CarFactory { 
    const HONDA = "Honda"; 
     public static function createCar($carType){ 
     switch($carType){ 
      case self::HONDA: 
      return new Honda(); 
      break; 
    } 
    die("Car isn't recognized."); 
    } 
    $carFactory = new CarFactory(); 
    //Create a Car 
    $Honda = $carFactory->createCar(CarFactory::HONDA); 
    var_dump($Honda); 

} 

感謝。 SV

+3

你不能從構造函數返回的任何值,使用一個靜態方法,就像你用我第二個例子 –

回答

0

在你的構造函數中,你嘗試返回一輛新車的一個實例。構造函數不返回任何值,但在創建對象時調用。 PHP確保new關鍵字始終返回構造類的實例。

而且由於CreateCar是靜態的,調用應該是這樣的:

$carFactory = new CarFactory(); 

// Now create a Car 
$Honda = $carFactory::createCar(CarFactory::HONDA); 
var_dump($Honda); 
+0

謝謝你的答覆... ...雖然我認爲這將是很好如果構造函數可能會返回一個值,如果提示這樣做...任何特殊原因不允許這樣做? –

+0

構造函數不能返回值!看我的帖子 – JvdBerg

3
abstract class Car { 
    public static function createCar(){ 
     try 
     { 
      // PHP 5.3+ support 
      return new static; 
     } 
     catch (Exception $e) 
     { 
      // in case child does not exists 
     } 
    } 
} 

class Honda extends Car { 

} 

$honda = Honda::createCar(); 
var_dump($honda); 
1

構造函數不能返回值。他們可以創建一個放置在其中的類的對象。你可以讓你的第二個這樣的代碼更短:

// Actually you don't need to create a new factory if your creation method is static 
$Honda = $carFactory::createCar(CarFactory::HONDA);