正如@koen所说,静态构造函数(或“命名构造函数”)只有利于证明意图。
但是,从5.4开始,出现了一种称为“取消引用”的东西,它允许您使用方法调用直接内联类实例化。
(new MyClass($arg1))->doSomething(); // works with newer versions of php
因此,静态构造函数仅在有多种方法可以实例化对象时才有用。如果只有一个(始终是相同类型的参数和参数数),则不需要静态构造函数。
但是,如果您有多种实例化方式,那么静态构造函数非常有用,因为它可以避免用无用的参数检查来污染主构造函数,从而削弱语言约束。
例:
<?php
class Duration
{
private $start;
private $end;
// or public depending if you still want to allow direct instantiation
private function __construct($startTimeStamp = null, $endTimestamp = null)
{
$this->start = $startTimestamp;
$this->end = $endTimestamp;
}
public static function fromDateTime(\DateTime $start, \DateTime $end)
{
return new self($start->format('U'), $end->format('U'));
}
public static function oneDayStartingToday()
{
$day = new self;
$day->start = time();
$day->end = (new \DateTimeImmutable)->modify('+1 day')->format('U');
return $day;
}
}
正如您在 中看到的,静态方法可以访问实例的私有字段!疯了不是吗?:)oneDayStartingToday
有关更好的解释,请参阅 http://verraes.net/2014/06/named-constructors-in-php/