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
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
=
[];
}
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
class
Foo
{
const
PHP
=
'PHP 8.2'
;
}
$searchableConstant
=
'PHP'
;
var_dump
(
constant
(
Foo
::class .
"::
{
$searchableConstant
}
"
));
class
Foo
{
const
PHP
=
'PHP 8.3'
;
}
$searchableConstant
=
'PHP'
;
var_dump
(
Foo
::
{
$searchableConstant
}
);
New #[Override] attribute
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).
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
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
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()
function
json_validate
(
string $string
):
bool
{
json_decode
(
$string
);
return
json_last_error
() ===
JSON_ERROR_NONE
;
}
var_dump
(
json_validate
(
'{ "test": { "foo": "bar" }
}'
));
// true
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()
// 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
;
// 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()
// 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
;
$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 -l foo.php bar.php
No syntax errors detected in foo.php
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.
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