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 ! 😇