recherche
Plus de journal des modificationsPlus de journal des modifications

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é

PHP < 8.4
classLocale{
privatestring$languageCode;
privatestring$countryCode;

public function__construct(string$languageCode,string$countryCode)
{
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}

public functiongetLanguageCode():string{
return$this->languageCode;
}

public functionsetLanguageCode(string$languageCode):void{
$this->languageCode=$languageCode;
}

public functiongetCountryCode():string{
return$this->countryCode;
}

public functionsetCountryCode(string$countryCode):void{
$this->countryCode=strtoupper($countryCode);
}

public functionsetCombinedCode(string$combinedCode):void{
[$languageCode,$countryCode]=explode('_',$combinedCode,2);
$this->setLanguageCode($languageCode);
$this->setCountryCode($countryCode);
}

public functiongetCombinedCode():string{
return\sprintf("%s_%s",$this->languageCode,$this->countryCode);
}
}

$brazilianPortuguese=newLocale('pt','br');

var_dump($brazilianPortuguese->getCountryCode());// BR

var_dump($brazilianPortuguese->getCombinedCode());// pt_BR
PHP 8.4
classLocale{
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=newLocale('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

PHP < 8.4
classPhpVersion{
privatestring$version='8.3';

public functiongetVersion():string{
return$this->version;
}

public functionincrement():void{
[$major,$minor]=explode('.',$this->version);
$minor++;
$this->version="{$major}.{$minor}";
}
}
PHP 8.4
classPhpVersion{
public private(set) string$version='8.4';

public functionincrement():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] Attribute

PHP < 8.4
classPhpVersion{
/**
* @deprecated 8.3 use PhpVersion::getVersion() instead
*/
public functiongetPhpVersion():string{
return$this->getVersion();
}

public functiongetVersion():string{
return'8.3';
}
}

$phpVersion=newPhpVersion();
// No indication that the method is deprecated.
echo$phpVersion->getPhpVersion();
PHP 8.4
classPhpVersion{
#[\Deprecated(
message:"use PhpVersion::getVersion() instead",
since:"8.4",
)]
public functiongetPhpVersion():string{
return$this->getVersion();
}

public functiongetVersion():string{
return'8.4';
}
}

$phpVersion=newPhpVersion();
// 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

PHP < 8.4
$dom=newDOMDocument();
$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=newDOMXPath($dom);

$node=$xpath->query('.//main/article[not(following-sibling::*)]')[0];

$classes=explode(" ",$node->className);// Simplified

var_dump(in_array("featured",$classes));// bool(true)
PHP 8.4
$dom=Dom\HTMLDocument::createFromString(
<<<'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

PHP < 8.4
$num1='0.12345';
$num2='2';
$result=bcadd($num1,$num2,5);

echo$result;// '2.12345'
var_dump(bccomp($num1,$num2)>0);// false
PHP 8.4
useBcMath\Number;

$num1=newNumber('0.12345');
$num2=newNumber('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

PHP < 8.4
$animal=null;
foreach(['dog','cat','cow','duck','goose']as$value){
if(str_starts_with($value,'c')){
$animal=$value;
break;
}
}

var_dump($animal);// string(3) "cat"
PHP 8.4
$animal=array_find(
['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

PHP < 8.4
$connection=newPDO(
'sqlite:foo.db',
$username,
$password,
);// object(PDO)

$connection->sqliteCreateFunction(
'prepend_php',
static fn ($string) => "PHP {$string}",
);

$connection->query('SELECT prepend_php(version) FROM php');
PHP 8.4
$connection=PDO::connect(
'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

PHP < 8.4
classPhpVersion{
public function getVersion(): string{
return'PHP 8.4';
}
}

var_dump(( newPhpVersion())->getVersion());
PHP 8.4
classPhpVersion{
public function getVersion(): string{
return'PHP 8.4';
}
}

var_dump(newPhpVersion()->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

  • New Lazy Objects.
  • New JIT implementation based on IR Framework.
  • New request_parse_body() function.
  • 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(), and DateTimeImmutable::setMicrosecond() methods.
  • New mb_trim(), mb_ltrim(), mb_rtrim(), mb_ucfirst(), and mb_lcfirst() functions.
  • New pcntl_getcpu(), pcntl_getcpuaffinity(), pcntl_getqos_class(), pcntl_setns(), and pcntl_waitid() functions.
  • New ReflectionClassConstant::isDeprecated(), ReflectionGenerator::isClosed(), and ReflectionProperty::isDynamic() methods.
  • New http_get_last_response_headers(), http_clear_last_response_headers(), and fpow() functions.
  • New XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(), XMLWriter::toStream(), XMLWriter::toUri(), and XMLWriter::toMemory() methods.
  • New grapheme_str_split() function.

Dépréciations et ruptures de compatibilité ascendante

  • IMAP, OCI8, PDO_OCI, and pspell extensions have been unbundled and moved to PECL.
  • Implicitly nullable parameter types are now deprecated.
  • Using _ as a class name is now deprecated.
  • Raising zero to the power of a negative number is now deprecated.
  • Passing invalid mode to round() throws ValueError.
  • Class constants from extensions date, intl, pdo, reflection, spl, sqlite, xmlreader are typed now.
  • GMP class is now final.
  • MYSQLI_SET_CHARSET_DIR, MYSQLI_STMT_ATTR_PREFETCH_ROWS, MYSQLI_CURSOR_TYPE_FOR_UPDATE, MYSQLI_CURSOR_TYPE_SCROLLABLE, and MYSQLI_TYPE_INTERVAL constants have been removed.
  • mysqli_ping(), mysqli_kill(), mysqli_refresh() functions, mysqli::ping(), mysqli::kill(), mysqli::refresh() methods, and MYSQLI_REFRESH_* constants have been deprecated.
  • stream_bucket_make_writeable() and stream_bucket_new() now return an instance of StreamBucket instead of stdClass.
  • exit() behavioral change.
  • E_STRICT constant has been deprecated.
De meilleures performances, une meilleure syntaxe, une sécurité de type améliorée.Passez à PHP 8.4 maintenant!

Pour les téléchargements de source de PHP 8.4, veuillez visiter letéléchargementspage. Des binaires Windows peuvent être trouvés sur lePHP pour Windowssite. La liste des modifications est enregistrée dans leChangelog.

Leguide de migrationest 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.