PHP 8.1 est sorti

Par:
fredericmazue

ven, 26/11/2021 - 15:44

Le projet PHP vient d'annoncer la disponibilité de PHP 8.1. Il s'agit d'une version majeure qui apporte de nombreuses nouvelles fonctionnalités et une importante amélioration des performances.

Enumérations

Parmi les nouveautés, nous trouvons l'arrivée des énumérations, similaires aux énumérations du langage C. Elles permettent l'écriture d'un code plus naturel et plus léger. Par exemple :

Avant PHP 8.1

class Status
{
    const DRAFT = 'draft';
    const PUBLISHED = 'published';
    const ARCHIVED = 'archived';
}
function acceptStatus(string $status) {...}

Avec PHP 8.1

enum Status
{
    case Draft;
    case Published;
    case Archived;
}
function acceptStatus(Status $status) {...}

Propriétés readonly

les propriétés en lecture seule, ou readonly d'exposer directement les propriétés publiques en lecture seule, sans craindre que les invariants de classe puissent être rompus par une modification externe. Les propriétés readonly sont initialisées une fois dans le constructeur de classe et ne peuvent plus êttre modifiées ensuite. L'exposition de propriétés publiques readonly allège le code car cela rend l'écriture d'un accesseur inutile.

Avant PHP 8.1 :

class BlogData
{
    private Status $status;

    public function __construct(Status $status)
    {
        $this->status = $status;
    }

    public function getStatus(): Status
    {
        return $this->status;   
    }
}

Avex PHP 8.1

class BlogData
{
    public readonly Status $status;

    public function __construct(Status $status)
    {
        $this->status = $status;
    }
}

La syntaxe First-class callable

L'avantage de cette nouvelle syntaxe est qu'elle permet l'analyse statique du code et qu'elle respecte la portée au moment où l'appelable est créé.

$fn = Closure::fromCallable('strlen');
$fn = strlen(...);

$fn = Closure::fromCallable([$this, 'method']);
$fn = $this->method(...)

$fn = Closure::fromCallable([Foo::class, 'method']);
$fn = Foo::method(...);

Dans l'exemple ci-dessus, chaque paire d'expressions est équivalente. La syntaxe strlen(...) crée un Closure qui fait référence à la fonction strlen(), et ainsi de suite.

Expression new dans les initialiseurs

Avec le support de new dans les initialiseurs, les objets peuvent désormais être utilisés comme valeurs de paramètres par défaut, variables statiques et constantes globales, ainsi que dans les arguments d'attribut.

Avant PHP 8.1

class Service
{
    private Logger $logger;

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

Avec PHP 8.1

class User
{
    #[\Assert\All(
        new \Assert\NotNull,
        new \Assert\Length(min: 6))
    ]
    public string $name = '';
}

Le type de retour never

Une fonction ou une méthode déclarée avec le type never indique qu'elle ne retournera pas de valeur et lèvera une exception ou terminera l'exécution du script avec un appel de die(), exit(), trigger_error(), ou quelque chose de similaire. Il est à remarquer que le type de retour never permet de détecter du code mort à l'analyse statique

Avant PHP 8.1

function redirect(string $uri) {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage() {
    redirect('/login');
    echo 'Hello'; // <- code mort ici
}

Avec PHP 8.1

function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // <- code mort détecté à l'analuse statique
}

Améliorations des performances

Alors que performances de PHP 7.4  et PHP 8.0 sont sensiblement équivalentes, l'équipe PHP annonce une accélération de l'exécution de 23% pour PHP 8.1, par rapport à PHP 8.0. Ceci pour la démonstration de Symfony. En revanche l'accélération de WordPress n'est que de 3.5%.

Toutes les nouveautés de PHPO 8.1 ici.