Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用静态方法创建对象_Php_Oop - Fatal编程技术网

Php 使用静态方法创建对象

Php 使用静态方法创建对象,php,oop,Php,Oop,我正在学习设计模式。我在下面给出的一个工厂设计模式的网站上给出了一个例子 class Automobile { private $bikeMake; private $bikeModel; public function __construct($make, $model) { $this->bikeMake = $make; $this->bikeModel = $model; } public function getMakeAndMo

我正在学习设计模式。我在下面给出的一个工厂设计模式的网站上给出了一个例子

class Automobile {
  private $bikeMake;
  private $bikeModel;

  public function __construct($make, $model) {
     $this->bikeMake = $make;
     $this->bikeModel = $model;
  }

  public function getMakeAndModel() {
     return $this->bikeMake . ' ' . $this->bikeModel;
  }
}




class AutomobileFactory {
  public static function create($make, $model) {
     return new Automobile($make, $model);
  }
}
$pulsar = AutomobileFactory::create('ktm', 'pulsar');

print_r($pulsar->getMakeAndModel());
在这里,我无法理解为什么在AutomobileFactory类中创建了一个静态方法来返回一个对象。如果我能做到的话

$pulsar= new Automobile('ktm', 'pulsar'); //Its more simple than below code of line

$pulsar=AutomobileFactory::create('ktm', 'pulsar');
为什么创建用于返回对象的静态函数?如果用一行就可以实现同样的目标

$pulsar=新汽车('ktm','pulsar')


为了正确地实现此模式(工厂方法),您应该将构造函数定义为private,然后您不能以这种方式创建对象:


$pulsar=新汽车('ktm','pulsar')当工厂可以返回接口的几个具体实现时,工厂模式通常很有用

当涉及驱动程序时非常有用,比如db驱动程序,工厂可以接受dbname作为参数(或者更好地从配置中读取),并为特定数据库返回正确的对象

通过这种方式,您可以对每个受支持的驱动程序使用相同的实例化,并将使用的特定db放入配置中


另一个例子是singleton,但是有一些很好的理由反对这种模式。

那么你也不能在工厂中创建它。看起来你误解了singleton和factory。这似乎不是使用工厂的好例子。你没有构建一个复杂的对象,也没有返回任何单一对象类型以外的东西。因此,我感到困惑。你的问题实际上是“为什么这个方法是静态的”,还是“这个工厂有什么意义”@Jonnix是的,也是“为什么这个静态的”?如果你能帮我解释为什么这个静态函数用于创建对象,这将非常有帮助。工厂只有一个作业,通常没有“状态”,因此实例化它通常只是开销。您可以摆脱静态,实例化类并调用create作为一个对象方法,大多数人都不会眨眼,而且开销很小,不会引起注意。因此,在某种程度上可以归结为个人偏好。