класс — зачем возвращать новую статику? (PHP)

Почему некоторые люди создают один метод, который возвращает новый 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');

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

18

Решение

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)->, что я считаю сомнительным.

18

Другие решения

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
3

По вопросам рекламы [email protected]