Статические конструкторы (или «именованные конструкторы») полезны только для доказательства намерения, как говорит @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/