2

私は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のオブジェクトです。リターン型はホンダ型のオブジェクトなので、なぜホンダ型のオブジェクトを作成しないのですか?コンストラクターを使用しているからですか?

ただし、以下のようにCarFactory内のメソッドを使用すると、Hondaタイプのオブジェクトが作成されます。

    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

4

4 に答える 4

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);
于 2012-12-17T05:46:25.043 に答える
1

コンストラクターは値を返すことができません。内部に配置されたクラスのオブジェクトを作成するだけです。次のように、2番目のコードを短くすることができます。

// Actually you don't need to create a new factory if your creation method is static
$Honda = $carFactory::createCar(CarFactory::HONDA);
于 2013-02-09T07:25:02.333 に答える
0

コンストラクターで、新しい車のインスタンスを返そうとします。コンストラクターは値を返しませんが、オブジェクトの作成中に呼び出されます。newPHPは、キーワードが常に構築されたクラスのインスタンスを返すことを保証します。

また、CreateCarは静的であるため、呼び出しは次のようになります。

$carFactory = new CarFactory();

// Now create a Car
$Honda = $carFactory::createCar(CarFactory::HONDA);
var_dump($Honda); 
于 2012-09-11T06:50:36.360 に答える
0

あなたがする必要があるのは、オブジェクト($ carFactory)を開始せずに静的クラスメソッドを直接使用することです。

$honda = CarFactory::createCar(CarFactory::HONDA);
于 2018-05-02T19:34:24.097 に答える