【问题标题】:Creating an object using factory pattern in PHP在 PHP 中使用工厂模式创建对象
【发布时间】:2012-09-11 06:45:42
【问题描述】:

我是 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

【问题讨论】:

  • 你不能从构造函数返回任何值,使用静态方法就像你使用第二个例子一样

标签: php design-patterns factory


【解决方案1】:
 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);

【讨论】:

    【解决方案2】:

    构造函数不能返回值。他们可以只创建他们所在的类的对象。你可以像这样使你的第二个代码更短:

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

    【讨论】:

      【解决方案3】:

      在您的构造函数中,您尝试返回一辆新车的实例。构造函数不返回任何值,而是在创建对象期间调用。 PHP 确保 new 关键字总是返回构造类的实例。

      因为CreateCar 是静态的,所以调用应该是这样的:

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

      【讨论】:

      • 感谢您的回复...虽然我认为如果构造函数在提示时可以返回一个值会很好...不允许这样做有什么特别的原因吗?
      • 构造函数不能返回值!看我的帖子
      【解决方案4】:

      你需要做的是直接使用静态类方法,不初始化对象($carFactory):

      $honda = CarFactory::createCar(CarFactory::HONDA);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 2010-11-21
        相关资源
        最近更新 更多