PHP 8.1: ‚new‘ v inicializátorech

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Nově lze použít klíčové slovo „new“ pro inicializaci třídy přímo ve výchozí hodnotě parametru funkce/metody. To opět zjednoduší psaní některých částí kódu.

Nyní bylo potřeba napsat toto (kódy jsou přímo z RFC):

<?php
class Test {
    private Logger $logger;
 
    public function __construct(
        ?Logger $logger = null,
    ) {
        $this->logger = $logger ?? new NullLogger;
    }
}

A od PHP 8.1 půjde kód zjednodušit takto:

<?php
class Test {
    public function __construct(
        private Logger $logger = new NullLogger,
    ) {}
}

Co je možné?

<?php
// Všechny 3 možnosti jsou povolené:
function test(
    $foo = new A,
    $bar = new B(1),
    $baz = new C(x: 2),
) { }

Co není možné?

<?php
// Není povoleno (vyvolá kompilační chybu):
function test(
    $a = new (CLASS_NAME_CONSTANT)(), // dynamický název třídy
    $b = new class {}, // anonymní třída
    $c = new A(...[]), // argumenty přes "rozbalení" pole
    $d = new B($abc), 
) { }

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře