

PHP 8.4 est une mise à jour majeure du langage PHP.
Il contient de nombreuses nouvelles fonctionnalités, telles que les crochets de propriété, la visibilité asymétrique, une API DOM mise à jour, des améliorations des performances, des corrections de bogues et un nettoyage général.
Passez à PHP 8.4 maintenant!Crochets de propriété
private string $languageCode;
private string $countryCode;
public function __construct ( string $languageCode, string $countryCode )
{
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getLanguageCode(): string {
return $this->languageCode;
}
public function setLanguageCode( string $languageCode ): void {
$this->languageCode = $languageCode;
}
public function getCountryCode(): string {
return $this->countryCode;
}
public function setCountryCode( string $countryCode ): void {
$this->countryCode = strtoupper($countryCode);
}
public function setCombinedCode( string $combinedCode ): void {
[ $languageCode, $countryCode ] = explode( '_', $combinedCode, 2 );
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}
public function getCombinedCode(): string {
return \sprintf( "%s_%s", $this->languageCode, $this->countryCode );
}
}
$brazilianPortuguese = new Locale( 'pt', 'br' );
var_dump( $brazilianPortuguese->getCountryCode() ); // BR
var_dump( $brazilianPortuguese->getCombinedCode() ); // pt_BR

public string $languageCode;
public string $countryCode {
set ( string $countryCode ) {
$this->countryCode = strtoupper($countryCode);
}
}
public string $combinedCode {
get => \sprintf( "%s_%s", $this->languageCode, $this->countryCode );
set ( string $value ) {
[ $this->languageCode, $this->countryCode ] = explode( '_', $value, 2 );
}
}
public function __construct( string $languageCode, string $countryCode ) {
$this->languageCode = $languageCode;
$this->countryCode = $countryCode;
}
}
$brazilianPortuguese = new Locale( 'pt', 'br' );
var_dump( $brazilianPortuguese->countryCode ); // BR
var_dump( $brazilianPortuguese->combinedCode ); // pt_BR
Les crochets de propriété prennent en charge les propriétés calculées qui peuvent être comprises nativement par les IDE et les outils d'analyse statique, sans avoir besoin d'écrire des commentaires DocBlock qui pourraient être synchronisés. En outre, ils permettent une pré-traitement fiable ou après le traitement des valeurs, sans avoir besoin de vérifier si un getteur ou un setter correspondant existe dans la classe.
Visibilité asymétrique
private string $version = '8.3' ;
public function getVersion(): string {
return $this->version;
}
public function increment(): void {
[ $major, $minor ] = explode( '.', $this->version );
$minor++;
$this->version = "{$major}.{$minor}" ;
}
}

public private(set) string $version = '8.4' ;
public function increment(): void {
[ $major, $minor ] = explode( '.', $this->version );
$minor++;
$this->version = "{$major}.{$minor}" ;
}
}
La portée d'écrire sur une propriété peut désormais être contr?lée indépendamment de la portée pour lire la propriété, réduisant la nécessité de méthodes Getter de Baillate pour exposer la valeur d'une propriété sans autoriser la modification de l'extérieur d'une classe.
#[\Deprecated] Attribut
/**
* @deprecated 8.3 use PhpVersion::getVersion() instead
*/
public function getPhpVersion(): string {
return $this->getVersion();
}
public function getVersion(): string {
return '8.3';
}
}
$phpVersion = new PhpVersion();
// No indication that the method is deprecated.
echo $phpVersion->getPhpVersion();

#[\Deprecated(
message: "use PhpVersion::getVersion() instead",
since: "8.4",
)]
public function getPhpVersion(): string {
return $this->getVersion();
}
public function getVersion(): string {
return '8.4';
}
}
$phpVersion = new PhpVersion();
// Deprecated: Method PhpVersion::getPhpVersion() is deprecated since 8.4, use PhpVersion::getVersion() instead
echo $phpVersion->getPhpVersion();
The new #[Deprecated] attribute makes PHP’s existing deprecation mechanism available to user-defined functions, methods, and class constants.
Nouvelles fonctionnalités EXT-DOM et support HTML5
$dom->loadHTML(
<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$xpath = new DOMXPath($dom);
$node = $xpath->query('.//main/article[not(following-sibling::*)]')[0];
$classes = explode(" ", $node->className); // Simplified
var_dump(in_array("featured", $classes)); // bool(true)

<<<'HTML'
<main>
<article>PHP 8.4 is a feature-rich release!</article>
<article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article>
</main>
HTML,
LIBXML_NOERROR,
);
$node = $dom->querySelector('main > article:last-child');
var_dump($node->classList->contains("featured")); // bool(true)
Nouvelle API DOM qui comprend la prise en charge conforme aux normes pour l'analyse des documents HTML5, corrige plusieurs bogues de conformité de longue date dans le comportement de la fonctionnalité DOM et ajoute plusieurs fonctions pour rendre le travail avec des documents plus pratique.
La nouvelle API DOM est disponible dans l'espace de noms DOM. Les documents utilisant la nouvelle API DOM peuvent être créés à l'aide des classes DOMHTMLDocument et DomxMLDocument.
API d'objet pour bcmath
$num2 = '2';
$result = bcadd($num1, $num2, 5);
echo $result; // '2.12345'
var_dump(bccomp($num1, $num2) > 0); // false

$num1 = new Number('0.12345');
$num2 = new Number('2');
$result = $num1 + $num2;
echo $result; // '2.12345'
var_dump($num1 > $num2); // false
Un nouvel objet BCMATHNUMBER permet une utilisation orientée objet et des opérateurs mathématiques standard lorsque vous travaillez avec des numéros de précision arbitraires.
Ces objets sont immuables et implémentent l'interface cha?nable, ils peuvent donc être utilisés dans des contextes de cha?ne comme Echo $ num.
New array_*() functions
foreach ( [ 'dog', 'cat', 'cow', 'duck', 'goose' ] as $value ) {
if ( str_starts_with($value, 'c') ) {
$animal = $value;
break;
}
}
var_dump($animal); // string(3) "cat"

[ 'dog', 'cat', 'cow', 'duck', 'goose' ],
static fn (string $value): bool => str_starts_with($value, 'c'),
);
var_dump($animal); // string(3) "cat"
Les nouvelles fonctions array_find (), array_find_key (), array_any () et array_all () sont disponibles.
Sous-classes spécifiques au conducteur APD
'sqlite:foo.db',
$username,
$password,
); // object(PDO)
$connection->sqliteCreateFunction(
'prepend_php',
static fn ($string) => "PHP {$string}",
);
$connection->query('SELECT prepend_php(version) FROM php');

'sqlite:foo.db',
$username,
$password,
); // object(Pdo\Sqlite)
$connection->createFunction(
'prepend_php',
static fn ($string) => "PHP {$string}",
); // Does not exist on a mismatching driver.
$connection->query('SELECT prepend_php(version) FROM php');
De nouvelles sous-classes PDODBLIB, PDOFIREBIRD, PDOMYSQL, PDOODBC, PDOPGSQL et PDOSQLITE de PDO sont disponibles.
new MyClass()->method()Sans parenthèses
public function getVersion(): string {
return 'PHP 8.4';
}
}
var_dump(( new PhpVersion())->getVersion());

public function getVersion(): string {
return 'PHP 8.4';
}
}
var_dump(new PhpVersion()->getVersion());
Les propriétés et les méthodes d'un objet nouvellement instancié sont désormais accessibles sans envelopper la nouvelle expression entre parenthèses.
Nouvelles classes, interfaces et fonctions
- Nouveaux objets paresseux.
- Nouvelle implémentation JIT basée sur le cadre IR.
- Nouvelle fonction request_parse_body ().
- New bcceil(),>bcdivmod(),bcfloor(), and bcround() functions.
- New RoundingMode enum for round() with 4 new rounding modes TowardsZero,AwayFromZero, NegativeInfinity,and PositiveInfinity.
- New DateTime :: CreateFromtimeStamp (), DateTime :: getMicRoseCond (), DateTime :: setMicroseCond (), DateTimeImmutable :: CreateFromtimestamp (), DateTimeImmutable :: getMicRosecond (), et DatetiTimeImmutable :: SetMicroSond () Methods.
- Les fonctions MB_TRIM (), MB_LTRIM (), MB_RTRIM (), MB_UCFirst () et MB_LCFirst ().
- Nouveau pcntl_getcpu (), pcntl_getcpuaffinity (), pcntl_getqos_class (), pcntl_setns () et pcntl_waitid ().
- Nouveau réflexionclassConstant :: isDepRecated (), ReflectionGenerator :: isClosed () et ReflectionProperty :: iSdynamic ().
- NOUVEAU HTTP_GET_LAST_RESPONSONS_HEADERS (), HTTP_CLEAR_LAST_RESPONSES_HEADERS () et FPow ().
- Nouveau XmlReader :: FromStream (), XmlReader :: Fromuri (), XmlReader :: FromString (), XmlWriter :: ToStream (), XmlWriter :: Touri () et XmlWriter :: Tomemory ().
- Nouvelle fonction graphème_str_split ().
Dépréciations et ruptures de compatibilité ascendante
- IMAP, OCI8, PDO_OCI, and pspell extensions have been unbundled and moved to PECL.
- Les types de paramètres implicitement nullables sont désormais obsolètes.
- L'utilisation de _ comme nom de classe est désormais obsolète.
- L'augmentation de zéro à la puissance d'un nombre négatif est désormais obsolète.
- Le passage du mode non valide à Round () lève ValueError.
- Les constantes de classe de Date d'extensions, INTL, PDO, Réflexion, SPL, SQLITE, XMLReader sont dactylographiées maintenant.
- La classe GMP est maintenant définitive.
- Mysqli_set_charset_dir, mysqli_stmt_attr_prefetch_rows, mysqli_cursor_type_for_update, mysqli_cursor_type_scrollable, et les constantes mysqli_type_interval ont été supprimées.
- mysqli_ping (), mysqli_kill (), mysqli_refresh () Fonctions, mysqli :: ping (), mysqli :: kill (), mysqli :: refresh () et mysqli_refresh_ * Les constantes ont été dépréciées.
- Stream_Bucket_Make_Writable () et Stream_Bucket_New () Renvoie désormais une instance de StreamBucket au lieu de StdClass.
- exit () Changement comportemental.
- La constante E_strict a été obsolète.
Pour les téléchargements de source de PHP 8.4, veuillez visiter le téléchargements page. Des binaires Windows peuvent être trouvés sur le PHP pour Windows site. La liste des modifications est enregistrée dans le Changelog.
Le guide de migration est disponible dans le manuel PHP. Veuillez le consulter pour une liste détaillée de nouvelles fonctionnalités et des modifications incompatibles vers l'arrière.