Pochylimy się nad ciekawym zagadnieniem, jakim jest return new oraz return new static. Do dzieła.
Zobaczmy co to za klasa:
class Request {
private function __construct(public $name)
{}
public static function make($name){
return new Request($name);
}
}
Konstruktor prywatny – nie można bawić się operatorem new poza klasą. Metoda statyczna make pozwala tworzyć obiekty tej klasy. Czasami to bywa przydatne.
A teraz taka klasa:
class Request
{
public function __construct(public string $uri,
public string $method,
public array $get,
public array $post,
public array $files,
public array $cookie,
public array $server)
{
}
public static function createFromGlobals()
{
return new static(
$_SERVER["REQUEST_URI"],
$_SERVER["REQUEST_METHOD"],
$_GET,
$_POST,
$_FILES,
$_COOKIE,
$_SERVER
);
}
}
Tutaj co prawda konstruktor jest publiczny, ale chodzi o coś innego – zwracamy new static zamiast new Request. Dlaczego?
Cóż, tutaj pozwalamy klasom pochodnym dziedziczyć z Request. I jeżeli dziedziczą i ich konstruktory się nie różnią od tego klasy bazowej, to statyczna metoda createFromGlobals zwróci new + ICH konstruktor.
Niezwykle przydatna cecha OOP w PHP.