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