Aller au contenu
Accueil » Nouveautés de PHP 8.1

Nouveautés de PHP 8.1

L’équipe PHP a sorti le 25 Novembre 2021 sa version 8.1 du langage. La version 8.0 était arrivée avec un tas de nouvelles fonctionnalités. Voyons ensemble ce que nous réserve la version suivante.

L’opérateur spread pour les tableaux contenant des clés à chaînes de caractères

Il était déjà possible de le faire depuis 7.4, mais uniquement avec les clés numériques. La raison était que PHP ne gérait pas les doublons. Maintenant c’est chose faite. Vous pouvez donc procéder ainsi :

$weekBegin = ['Tuesday' => 2, 'Wednesday' => 3];
$weekMiddle = ['Thursday' => 4, 'Friday' => 5];
$weekEnd = ['Saturday' => 6, 'Sunday' => 7];

$week = ['Monday' => 1, ...$weekBegin, ...$weekMiddle, ...$weekEnd];
Array
(
    "Monday" => 1
    "Tuesday" => 2
    "Wednesday" => 3
    "Thursday" => 4
    "Friday" => 5
    "Saturday" => 6
    "Sunday" => 7
)

Les Fibers

Les Fibers sont des fonctions qu’on ne peut pas interompre, et qui peuvent être utilisées pour implémenter de la multitâche coopérative. C’est en bref, un morceau de code que vous pouvez mettre en pause et reprendre plus tard. La feature a été ajoutée dans PHP, mais est encore en phase de test, et de développement. Voici ce que donne une simple utilisation d’un Fiber :

$fiber = new Fiber(function (): void {
    $value = Fiber::suspend('Suspended value');
    echo "Value used to resume fiber: ", $value, "\n";
});

$value = $fiber->start();

echo "Value from fiber suspending: ", $value, "\n";

$fiber->resume('Hi again');
Value from fiber suspending: Suspended value
Value used to resume fiber: Hi again

Notation octale explicite

Vous pouvez dorénavant écrire des valeurs numériques directement en octet. Cette notation se fait avec le préfixe 0o :

echo (0o16 === 16 ? 'true' : 'false') . "\n";
echo (0o16 === 14 ? 'true' : 'false') . "\n";
echo 0o7716_1414;
false
true
16573196

Constantes finales

La possibilité de déclarer des constantes finales au sein d’une classe est désormais possible. Très utile pour éviter qu’elles soient écrasées par des classes enfants :

ParentClass.php

class ParentClass
{
    final const IMMUTABLE = 'Try to change me';
}

ChildClass.php

require "ParentClass.php";

class ChildClass extends ParentClass
{
    public const IMMUTABLE = 'Okay, let me try';
}

index.php

require "ChildClass.php";

$child = new ChildClass();
Fatal error: ChildClass::IMMUTABLE cannot override final constant ParentClass::IMMUTABLE

Le type de retour never

Une fonction ou une méthode déclarée avec le type never indique qu’elle ne renverra pas de valeur et lèvera une exception :

function neverReturn(): never
{
    return 'never';
}

echo neverReturn();
Fatal error: A never-returning function must not return

Intersection de types comme arguments de méthodes

Il était déjà possible dans les méthodes de proposer plusieurs types pour un argument, avec le symbole « | » :

function sumNumbers(int|float $numberOne, int|float $numberTwo)

Vous pouvez maintenant utiliser le symbole « & » afin d’exiger pour un argument d’une méthode l’intersection de 2 types :

function iterate(Iterator&Countable $iterator)
{
    echo "This object contains " . $iterator->count() . " elements\n";
    foreach ($iterator as $item) {
        echo $item . "\n";
    }
}

$days = ['Monday', 'Tuesday'];

iterate(new ArrayIterator($days));
This object contains 2 elements
Monday
Tuesday

Si la valeur envoyée ne correspond pas, une exception sera levée :

Fatal error: Uncaught TypeError: iterate(): Argument #1 ($iterator) must be of type Iterator&Countable, array given

Support de « new » dans les constructeurs

Les objets des constructeurs peuvent maintenant être créés directement via un « new« . Il est également possible de le faire sur toute initialisation, par exemple dans des annotations :

use Assert\All;
use Assert\Length;
use Assert\NotNull;

final class TestClass
{
    private Generator $generator;

    #[All(
        new NotNull,
        new Length(min: 5))
    ]
    private string $name;

    public function __construct(Generator $generator)
    {
        $this->generator = new Generator();
    }
}

Propriété readonly

Les propriétés en lecture seule ne peuvent pas être modifiées après leur initialisation, c’est-à-dire après qu’une valeur leur a été affectée :

TestClass.php

final class TestClass
{
    public readonly string $name;

    public function setName(string $name)
    {
        $this->name = $name;
    }
}

index.php

include "TestClass.php";

$test = new TestClass();

$test->setName('John');
$test->setName('Jack');

Dans l’exemple ci-dessus, le premier appel fonctionnera, car la propriété name n’a pas encore été initialisée. En revanche, le deuxième appel lèvera une exception :

Fatal error: Uncaught Error: Cannot modify readonly property TestClass::$name

Les classes d’énumération

PHP 8.1 arrive avec un type de classe spécifique pour déclarer vos constantes d’énumération. Cela se passe comme suit :

Days.php

enum Days
{
    case MONDAY;
    case TUESDAY;
    case WEDNESDAY;
    case THURSDAY;
    case FRIDAY;
    case SATURDAY;
    case SUNDAY;
}

index.php

include "Days.php";

echo 'First day of week = ' . Days::MONDAY->name;

print_r(Days::cases());
First day of week = MONDAY
Array
(
    [0] => Days Enum([name] => MONDAY)
    [1] => Days Enum([name] => TUESDAY)
    [2] => Days Enum([name] => WEDNESDAY)
    [3] => Days Enum([name] => THURSDAY)
    [4] => Days Enum([name] => FRIDAY)
    [5] => Days Enum([name] => SATURDAY)
    [6] => Days Enum([name] => SUNDAY)
)

Conclusion

Et voilà, vous savez tout sur la version 8.1 de PHP. À vos claviers pour prendre en main toutes ces nouvelles fonctionnalités ! 😇

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *