Plus de journal des modifications Plus de journal des modifications

PHP 8.3 est une mise à jour majeure du langage PHP.

Il contient de nombreuses nouvelles fonctionnalités, telles que le typage explicite des constantes de classe, le clonage profond des propriétés en lecture seule et les ajouts à la fonctionnalité aléatoire. Comme toujours, il inclut également des améliorations de performances, des corrections de bugs et un nettoyage général.

Passez à PHP 8.3 maintenant !

Constantes de classe typées

PHP < 8.3
interface I {
// We may naively assume that the PHP constant is always a string.
const PHP = 'PHP 8.2' ;
}

class Foo implements I {
// But implementing classes may define it as an array.
const PHP = [];
}
PHP 8.3
interface I {
const string PHP = 'PHP 8.2' ;
}

class Foo implements I {
const string PHP = [];
}
// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string

Récupération constante de classe dynamique

PHP < 8.3
class Foo {
const PHP = 'PHP 8.2' ;
}

$searchableConstant = 'PHP' ;

var_dump ( constant ( Foo ::class . ":: { $searchableConstant } " ));
PHP 8.3
class Foo {
const PHP = 'PHP 8.3' ;
}

$searchableConstant = 'PHP' ;

var_dump ( Foo :: { $searchableConstant } );

New #[Override] attribute

PHP < 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).
PHP 8.3
use PHPUnit\Framework\TestCase ;

final class MyTest extends TestCase {
protected $logFile ;

protected function setUp (): void {
$this -> logFile = fopen ( '/tmp/logfile' , 'w' );
}

#[ \Override ]
protected function taerDown (): void {
fclose ( $this -> logFile );
unlink ( '/tmp/logfile' );
}
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).

By adding the #[Override] attribute to a method, PHP will ensure that a method with the same name exists in a parent class or in an implemented interface. Adding the attribute makes it clear that overriding a parent method is intentional and simplifies refactoring, because the removal of an overridden parent method will be detected.

Clonage profond des propriétés en lecture seule

PHP < 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

// Fatal error: Cannot modify readonly property Foo::$php
PHP 8.3
class PHP {
public string $version = '8.2' ;
}

readonly class Foo {
public function __construct (
public PHP $php
) {}

public function __clone (): void {
$this -> php = clone $this -> php ;
}
}

$instance = new Foo (new PHP ());
$cloned = clone $instance ;

$cloned -> php -> version = '8.3' ;

Les propriétés en lecture seule peuvent désormais être modifiées une fois dans la méthode magique __clone pour permettre le clonage en profondeur des propriétés en lecture seule.

Nouvelle fonction json_validate()

PHP < 8.3
function json_validate ( string $string ): bool {
json_decode ( $string );

return json_last_error () === JSON_ERROR_NONE ;
}

var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true
PHP 8.3
var_dump ( json_validate ( '{ "test": { "foo": "bar" }
}' )); // true

json_validate() permet de vérifier si une chaîne est syntaxiquement valide JSON, tout en étant plus efficace que json_decode().

Nouvelle méthode Randomizer::getBytesFromString()

PHP < 8.3
// This function needs to be manually implemented.
function getBytesFromString ( string $string , int $length ) {
$stringLength = strlen ( $string );

$result = '' ;
for ( $i = 0 ; $i < $length ; $i ++) {
// random_int is not seedable for testing, but secure.
$result .= $string [ random_int ( 0 , $stringLength - 1 )];
}

return $result ;
}

$randomDomain = sprintf (
"%s.example.com" ,
getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;
PHP 8.3
// A \Random\Engine may be passed for seeding,
// the default is the secure engine.
$randomizer = new \Random\Randomizer ();

$randomDomain = sprintf (
"%s.example.com" ,
$randomizer -> getBytesFromString (
'abcdefghijklmnopqrstuvwxyz0123456789' ,
16 ,
),
);

echo $randomDomain ;

L'extension aléatoire ajoutée dans PHP 8.2 a été étendue par une nouvelle méthode pour générer des chaînes aléatoires composées uniquement d'octets spécifiques. Cette méthode permet au développeur de générer facilement des identifiants aléatoires, tels que des noms de domaine et des chaînes numériques de longueur arbitraire.

Nouvelles méthodes Randomizer::getFloat() et Randomizer::nextFloat()

PHP < 8.3
// Returns a random float between $min and $max, both including.
function getFloat ( float $min , float $max ) {
// This algorithm is biased for specific inputs and may
// return values outside the given range. This is impossible
// to work around in userland.
$offset = random_int ( 0 , PHP_INT_MAX ) / PHP_INT_MAX ;

return $offset * ( $max - $min ) + $min ;
}

$temperature = getFloat (- 89.2 , 56.7 );
$chanceForTrue = 0.1 ;
// getFloat(0, 1) might return the upper bound, i.e. 1,
// introducing a small bias.
$myBoolean = getFloat ( 0 , 1 ) < $chanceForTrue ;
PHP 8.3
$randomizer = new \Random\Randomizer ();

$temperature = $randomizer -> getFloat (
-89.2 ,
56.7 ,
\Random\IntervalBoundary :: ClosedClosed ,
);

$chanceForTrue = 0.1 ;
// Randomizer::nextFloat() is equivalent to
// Randomizer::getFloat(0, 1, \Random\IntervalBoundary::ClosedOpen).
// The upper bound, i.e. 1, will not be returned.
$myBoolean = $randomizer -> nextFloat () <
$chanceForTrue ;

En raison de la précision limitée et de l'arrondi implicite des nombres à virgule flottante, la génération d'un flottant impartial se situant dans un intervalle spécifique n'est pas triviale et les solutions utilisateur couramment utilisées peuvent générer des résultats biaisés ou des nombres en dehors de la plage demandée.

Le Randomizer a également été étendu avec deux méthodes pour générer des flottants aléatoires de manière impartiale. La méthode Randomizer::getFloat() utilise l'algorithme de section γ publié dans Drawing Random Floating-Point Numbers from an Interval. Frédéric Goualard, ACM Trans. Modèle. Calculer. Simul., 32:3, 2022.

Linter de ligne de commande prend en charge plusieurs fichiers

PHP < 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
PHP 8.3
php -l foo.php bar.php
No syntax errors detected in foo.php
No syntax errors detected in bar.php

Le linter en ligne de commande accepte désormais les entrées variadiques pour les noms de fichiers à lint

Nouvelles classes, interfaces et fonctions

  • Nouveau DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertAdjacentText(), DOMElement::toggleAttribute(), DOMNode::contains(), DOMNode::getRootNode(), DOMNode::isEqualNode(), Méthodes DOMNameSpaceNode::contains() et DOMParentNode::replaceChildren().
  • Nouvelles méthodes IntlCalendar::setDate(), IntlCalendar::setDateTime(), IntlGregorianCalendar::createFromDate() et IntlGregorianCalendar::createFromDateTime().
  • Nouvelles fonctions ldap_connect_wallet() et ldap_exop_sync().
  • Nouvelle fonction mb_str_pad().
  • Nouvelles fonctions posix_sysconf(), posix_pathconf(), posix_fpathconf() et posix_eaccess().
  • Nouvelle méthode ReflectionMethod::createFromMethodName().
  • Nouvelle fonction socket_atmark().
  • Nouvelles fonctions str_increment(), str_decrement() et stream_context_set_options().
  • Nouvelle méthode ZipArchive::getArchiveFlag().
  • Support for generation EC keys with custom EC parameters in OpenSSL extension.
  • Nouveau paramètre INI zend.max_allowed_stack_size pour définir la taille maximale autorisée de la pile.
  • php.ini prend désormais en charge la syntaxe de repli/valeur par défaut.
  • Les classes anonymes peuvent désormais être en lecture seule.

Dépréciations et ruptures de compatibilité ascendante

  • Exceptions de date/heure plus appropriées.
  • L'attribution d'un index n négatif à un tableau vide garantira désormais que l'index suivant est n 1 au lieu de 0.
  • Modifications apportées à la fonction range().
  • Changes in re-declaration of static properties in traits.
  • La constante U_MULTIPLE_DECIMAL_SEPERATORS est obsolète au profit de U_MULTIPLE_DECIMAL_SEPARATORS.
  • La variante MT_RAND_PHP Mt19937 est obsolète.
  • ReflectionClass::getStaticProperties() n'est plus nullable.
  • Les paramètres INI assert.active, assert.bail, assert.callback, assert.exception et assert.warning sont obsolètes.
  • Les appels à get_class() et get_parent_class() sans arguments sont obsolètes.
  • SQLite3 : mode d'erreur par défaut défini sur les exceptions.
De meilleures performances, une meilleure syntaxe, une sécurité de type améliorée. Passez à PHP 8.3 maintenant !

Le guide de migration est disponible dans le manuel PHP. Veuillez le consulter pour une liste détaillée des nouvelles fonctionnalités et des modifications rétrocompatibles.

Si vous devez télécharger des versions précédentes, vous pouvez consulter Plus de journal des modifications