PHP 8.5 est une mise à jour majeure du langage PHP, avec de nouvelles fonctionnalités incluant l'extension URI, l'opérateur Pipe et la prise en charge de la modification des propriétés lors du clonage.
Plus rapide, plus propre et conçu pour les développeurs.
PHP 8.5 ajoute une extension URI native pour analyser, normaliser et gérer les URL conformément aux standards RFC 3986 et WHATWG URL.
L'opérateur |> permet d'enchaîner des callables de gauche à droite, en transmettant les valeurs fluidement à travers plusieurs fonctions sans variables intermédiaires.
Clonez des objets et mettez à jour leurs propriétés grâce à la nouvelle syntaxe clone(), simplifiant le pattern « with-er » pour les classes readonly.
#[\NoDiscard]
L'attribut #[\NoDiscard] émet un avertissement lorsqu'une valeur de retour n'est pas utilisée, aidant à prévenir les erreurs et à améliorer la sécurité globale des API.
Les closures statiques et les callables de première classe peuvent désormais être utilisés dans les expressions constantes, comme les paramètres d'attributs.
Les handles peuvent désormais être conservés entre plusieurs requêtes PHP, évitant le coût de l'initialisation répétée des connexions vers les mêmes hôtes.
La nouvelle extension URI, toujours disponible, fournit des API pour analyser et modifier de manière sécurisée les URI et URL selon les standards RFC 3986 et WHATWG URL.
Propulsée par les bibliothèques uriparser (RFC 3986) et Lexbor (WHATWG URL).
Pour en savoir plus sur l'histoire de cette fonctionnalité, consultez le blog de la PHP Foundation.
$components = parse_url('https://php.net/releases/8.4/en.php');
var_dump($components['host']);
// string(7) "php.net"use Uri\Rfc3986\Uri;
$uri = new Uri('https://php.net/releases/8.5/en.php');
var_dump($uri->getHost());
// string(7) "php.net"L'opérateur pipe permet d'enchaîner des appels de fonctions sans avoir recours à des variables intermédiaires. Il permet de remplacer de nombreux « appels imbriqués » par une chaîne qui se lit de gauche à droite, plutôt que de l'intérieur vers l'extérieur.
Pour en savoir plus sur l'histoire de cette fonctionnalité, consultez le blog de la PHP Foundation.
$title = ' PHP 8.5 Released ';
$slug = strtolower(
str_replace('.', '',
str_replace(' ', '-',
trim($title)
)
)
);
var_dump($slug);
// string(15) "php-85-released"$title = ' PHP 8.5 Released ';
$slug = $title
|> trim(...)
|> (fn($str) => str_replace(' ', '-', $str))
|> (fn($str) => str_replace('.', '', $str))
|> strtolower(...);
var_dump($slug);
// string(15) "php-85-released"Il est désormais possible de mettre à jour des propriétés lors du clonage d'un objet en passant un tableau associatif à la fonction clone(). Cela permet une prise en charge simple du pattern « with-er » pour les classes readonly.
readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
$values = get_object_vars($this);
$values['alpha'] = $alpha;
return new self(...$values);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);readonly class Color
{
public function __construct(
public int $red,
public int $green,
public int $blue,
public int $alpha = 255,
) {}
public function withAlpha(int $alpha): self
{
return clone($this, [
'alpha' => $alpha,
]);
}
}
$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);#[\NoDiscard]En ajoutant l'attribut #[\NoDiscard] à une fonction, PHP vérifie si la valeur retournée est consommée et émet un avertissement dans le cas contraire. Cela permet d'améliorer la sécurité des API pour lesquelles la valeur de retour est importante, mais peut facilement être oubliée par inadvertance.
Le cast associé (void) peut être utilisé pour indiquer qu'une valeur est intentionnellement ignorée.
function getPhpVersion(): string
{
return 'PHP 8.4';
}
getPhpVersion(); // No warning#[\NoDiscard]
function getPhpVersion(): string
{
return 'PHP 8.5';
}
getPhpVersion();
// Warning: The return value of function getPhpVersion() should
// either be used or intentionally ignored by casting it as (void)Les closures statiques et les callables de première classe peuvent désormais être utilisés dans les expressions constantes. Cela inclut les paramètres d'attributs, les valeurs par défaut des propriétés et des paramètres, ainsi que les constantes.
final class PostsController
{
#[AccessControl(
new Expression('request.user === post.getAuthor()'),
)]
public function update(
Request $request,
Post $post,
): Response {
// ...
}
}Contrairement à curl_share_init(), les handles créés par curl_share_init_persistent() ne seront pas détruits à la fin de la requête PHP. Si un handle partagé persistant avec le même ensemble d'options de partage est trouvé, il sera réutilisé, évitant ainsi le coût d'initialisation des handles cURL à chaque fois.
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_exec($ch);array_first() et array_last()Les fonctions array_first() et array_last() retournent respectivement la première ou la dernière valeur d'un tableau. Si le tableau est vide, null est retourné (ce qui facilite la composition avec l'opérateur ??).
$lastEvent = $events === []
? null
: $events[array_key_last($events)];$lastEvent = array_last($events);#[\Override] peut désormais être appliqué aux propriétés.#[\Deprecated] peut être utilisé sur les traits et les constantes.final via la promotion de propriétés dans le constructeur.Closure::getCurrent() pour simplifier la récursion dans les fonctions anonymes.setcookie() et setrawcookie() prennent désormais en charge la clé « partitioned ».get_error_handler() et get_exception_handler() sont disponibles.Dom\Element::getElementsByClassName() et Dom\Element::insertAdjacentHTML() sont disponibles.grapheme_levenshtein().#[\DelayedTargetValidation] peut être utilisé pour supprimer les erreurs à la compilation provenant des attributs du noyau et des extensions utilisés sur des cibles invalides.shell_exec() a été déprécié.(boolean), (integer), (double) et (binary) ont été dépréciés. Utilisez respectivement (bool), (int), (float) et (string) à la place.disable_classes a été supprimé car il entraîne des ruptures dans diverses hypothèses du moteur.case par un point-virgule au lieu d'un deux-points a été dépréciée.null comme décalage de tableau ou lors de l'appel de array_key_exists() est désormais dépréciée. Utilisez une chaîne vide à la place.class_alias().__sleep() et __wakeup() ont été légèrement dépréciées. Les méthodes magiques __serialize() et __unserialize() devraient être utilisées à la place.NAN vers d'autres types.null) avec [] ou list() émet désormais un avertissement.int s'ils ne peuvent pas être représentés comme tels.