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