Зачем возвращать новый статический? (PHP)

Почему некоторые люди создают один метод, который возвращает новый статический элемент вместо того, чтобы сделать все методы статическими? В чем причина того, что этот метод возвращает новый статический ? Я не спрашиваю, в чем разница между статикой и самостью, или тем, что статично и само по себе. Например, вот один простой класс:

<?php class Expression { public static function make() { return new static; } public function find($value) { return '/' . $value .'/'; } public function then($value) { return $this->find($value); } public function hi($value) { return "hi"; } } 

Как вы можете видеть, существует статический метод make (), который возвращает новый статический . Затем некоторые люди называют другие методы:

 $regex = Expression::make()->find('www'); 

В чем его цель? Я вижу, что здесь мы не используем новый синтаксис выражения , и если это так, то почему они не сделали все методы такими, например, статическими? В чем разница, в чем причина того, что этот метод возвращает новый статический ?

new static экземпляр создает новый объект из текущего класса и работает с поздними статическими привязками (создает экземпляр подкласса, если класс был подклассом, я ожидаю, что вы это поймете).

Наличие static метода для класса, который возвращает новый экземпляр, является альтернативным конструктором . Смысл, как правило, ваш конструктор является public function __construct , и обычно для этого требуется определенная группа параметров:

 class Foo { public function __construct(BarInterface $bar, array $baz = []) { ... } } 

Наличие альтернативного конструктора позволяет вам предоставлять различные значения по умолчанию или удобные ярлыки для создания экземпляра этого класса без необходимости предоставления этих конкретных аргументов и / или для возможности предоставления разных аргументов, которые альтернативный конструктор будет преобразовывать в канонические:

 class Foo { public function __construct(BarInterface $bar, array $baz = []) { ... } public static function fromBarString($bar) { return new static(new Bar($bar)); } public static function getDefault() { return new static(new Bar('baz'), [42]); } } 

Теперь, хотя ваш канонический конструктор требует кучу сложных аргументов, вы можете создать экземпляр по умолчанию вашего класса, который, вероятно, будет хорош для большинства применений, просто с помощью Foo::getDefault() .

Канонический пример в PHP для этого – DateTime и DateTime::createFromFormat .

В вашем конкретном примере альтернативный конструктор фактически ничего не делает, поэтому он довольно лишний, но я ожидаю, что это потому, что это неполный пример. Если в действительности есть альтернативный конструктор, который делает ничего, кроме new static , это, вероятно, просто означает удобный синтаксис над (new Foo)-> , который я считаю сомнительным.

get_called_class() ).

 class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_self()); // A echo get_class(A::get_static()); // A