IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

PHP 8.3, mise à jour majeure du langage PHP, est disponible
Parmi les nouvelles fonctionnalités : le typage explicite des constantes de classe, le clonage profond des propriétés en lecture seule

Le , par Jade Emy

27PARTAGES

8  0 
PHP 8.3 est une mise à jour majeure du langage PHP. Elle 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 l'ajout de fonctionnalités aléatoires. Comme toujours, elle inclut également des améliorations de performance, des corrections de bogues et un nettoyage général.



Constantes de classe typées

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
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
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
interface I {
    const string PHP = 'PHP 8.3';
}

class Foo implements I {
    const string PHP = [];
}

// Fatal error: Cannot use array as value for class constant
// Foo::PHP of type string

Recherche dynamique de constantes de classe

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
class Foo {
    const PHP = 'PHP 8.2';
}

$searchableConstant = 'PHP';

var_dump(constant(Foo::class . "::{$searchableConstant}"));
PHP 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
class Foo {
    const PHP = 'PHP 8.3';
}

$searchableConstant = 'PHP';

var_dump(Foo::{$searchableConstant});

Nouvel attribut #[\Override]

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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');
    }
}

// Fatal error: MyTest::taerDown() has #[\Override] attribute,
// but no matching parent method exists
En ajoutant l'attribut #[\Override] à une méthode, PHP s'assurera qu'une méthode portant le même nom existe dans une classe parente ou dans une interface implémentée. L'ajout de l'attribut indique clairement que la surcharge d'une méthode parente est intentionnelle et simplifie le remaniement, car la suppression d'une méthode parente surchargée sera détectée.

Clonage profond des propriétés en lecture seule

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 readonly peuvent désormais être modifiées une fois dans la méthode magique __clone pour permettre le clonage profond des propriétés en lecture seule.

Nouvelle fonction json_validate()

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
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
Code : Sélectionner tout
var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true
json_validate() permet de vérifier si une chaîne est syntaxiquement valide en JSON, tout en étant plus efficace que json_decode().

Nouvelle méthode Randomizer::getBytesFromString()

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
// 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 Random qui a été ajoutée en PHP 8.2 a été complétée 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 les noms de domaine, et des chaînes numériques de longueur arbitraire.

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

PHP < 8.3
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
$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 nombre flottant non biaisé se situant dans un intervalle spécifique n'est pas triviale et les solutions userland couramment utilisées peuvent générer des résultats biaisés ou des nombres en dehors de l'intervalle demandé.

Le Randomizer a également été étendu avec deux méthodes pour générer des nombres flottants aléatoires de manière non biaisée. La méthode Randomizer::getFloat() utilise l'algorithme &#947;-section.

Le linter en ligne de commande prend en charge plusieurs fichiers

PHP < 8.3
Code : Sélectionner tout
1
2
php -l foo.php bar.php
No syntax errors detected in foo.php
PHP 8.3
Code : Sélectionner tout
1
2
3
php -l foo.php bar.php
No syntax errors detected in foo.php
No syntax errors detected in bar.php
La ligne de commande linter accepte maintenant des entrées variables pour les noms de fichiers à lister.

Nouvelles classes, interfaces et fonctions

  • Nouvelles méthodes DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertAdjacentText(), DOMElement::toggleAttribute(), DOMNode::contains(), DOMNode::getRootNode(), DOMNode::isEqualNode(), 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 de la génération de clés EC avec des paramètres EC personnalisés dans l'extension OpenSSL.
  • Nouveau paramètre INI zend.max_allowed_stack_size pour définir la taille maximale autorisée de la pile.
  • php.ini supporte maintenant la syntaxe des valeurs par défaut.
  • Les classes anonymes peuvent maintenant être en lecture seule.


Dépréciations et ruptures de compatibilité

  • Exceptions de date et d'heure plus appropriées.
  • L'assignation d'un index négatif n à un taCleau vide s'assurera maintenant que l'index suivant est n + 1 au lieu de 0.
  • Modifications de la fonction range().
  • Changements dans la re-déclaration des propriétés statiques dans les traits.
  • La constante U_MULTIPLE_DECIMAL_SEPERATORS est dépréciée en faveur de U_MULTIPLE_DECIMAL_SEPARATORS.
  • La variante MT_RAND_PHP Mt19937 est oCsolè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 : Le mode d'erreur par défaut est défini sur exceptions.


Mettre à jour vers PHP 8.3 !

Source : PHP

Et vous ?

Quel est votre avis sur cette mise à jour de PHP ?

Voir aussi :

PHP 8.2 est disponible et s'accompagne des propriétés "en lecture seule" aux classes, ainsi que la possibilité de déprécier les propriétés dynamiques

PHP 8.2 est disponible en bêta 2. Cette version propose null, true et false en tant que types autonomes, ainsi que des constantes dans les traits

PHP 8.2 apportera de nouvelles fonctionnalités et les améliorations de performances, annoncée pour la fin de 2022

Une erreur dans cette actualité ? Signalez-nous-la !