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.