PHP 8 sera publié le 26 novembre 2020. Il s'agit d'une nouvelle version majeure, ce qui signifie qu'elle introduira quelques changements importants, ainsi que de nombreuses nouvelles fonctionnalités et améliorations de performance. Pour l'instant, PHP 8 est en "feature freeze", ce qui signifie qu'aucune nouvelle fonctionnalité ne peut plus être ajoutée.

En raison de quelques ruptures fonctionnelles, il est très probable que vous deviez modifier votre code pour qu'il fonctionne avec PHP 8. Si vous êtes resté à jour avec les dernières versions, la mise à jour ne devrait pas être trop difficile, car la plupart des modifications étaient déjà signalées comme obsolètes dans les versions 7.*.

PHP 8 apporte également un bel ensemble de nouvelles fonctionnalités telles que le compilateur JIT, les "Union types" (Les types à choix multiples), les attributs, et plus encore.

Nouvelles fonctionnalités

Types d'Union

Étant donné la nature dynamique du PHP, il existe de nombreux cas où les types d'union peuvent être utiles. Les types d'union sont une collection de deux ou plusieurs types qui indiquent que l'un ou l'autre peut être utilisé.

Maintenant, la RFC des types d’Union 2.0 propose d’ajouter la prise en charge des types d’Union dans les signatures de fonctions (ce n'était possible que dans un DocBlock). Il sera désormais possible de définir les types d’Union avec une syntaxe T1|T2|... à la place :

class Number {
	private int|float $number;

	public function setNumber(int|float $number): void {
		$this->number = $number;
	}

	public function getNumber(): int|float {
		return $this->number;
	}
}

Notez que void ne peut jamais faire partie d'un type d'union, puisqu'il indique "aucune valeur de retour du tout". De plus, les unions nullable peuvent être écrites en utilisant |null, ou en utilisant la notation ? existante :

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

JIT

Le compilateur JIT - just in time - promet des améliorations significatives de performances, bien que pas particulièrement dans le contexte des requêtes web. J'ai fait mes propres tests de performance sur une instance Drupal, et il semble que JIT ne fasse pas une grande différence, si tant est qu'il en fasse une, sur ce genre de projets PHP.