class BlogData
{
public readonly string $title;
public readonly Status $status;
public function __construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
readonly class BlogData
{
public string $title;
public Status $status;
public function __construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
class Foo {
public function bar(mixed $entity) {
if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
return $entity;
}
throw new Exception('Invalid entity');
}
}
class Foo {
public function bar((A&B)|null $entity) {
return $entity;
}
}
null
, false
, et true
comme types stand-alone RFC
RFC
class Falsy
{
public function almostFalse(): bool { /* ... */ *}
public function almostTrue(): bool { /* ... */ *}
public function almostNull(): string|null { /* ... */ *}
}
class Falsy
{
public function alwaysFalse(): false { /* ... */ *}
public function alwaysTrue(): true { /* ... */ *}
public function alwaysNull(): null { /* ... */ *}
}
use Random\Engine\Xoshiro256StarStar;
use Random\Randomizer;
$blueprintRng = new Xoshiro256StarStar(
hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true)
);
$fibers = [];
for ($i = 0; $i < 8; $i++) {
$fiberRng = clone $blueprintRng;
// Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling
// 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed.
$blueprintRng->jump();
$fibers[] = new Fiber(function () use ($fiberRng, $i): void {
$randomizer = new Randomizer($fiberRng);
echo "{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
});
}
// The randomizer will use a CSPRNG by default.
$randomizer = new Randomizer();
// Even though the fibers execute in a random order, they will print the same value
// each time, because each has its own unique instance of the RNG.
$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
$fiber->start();
}
L'extension "random" fournit une nouvelle API orientée objet de génération de nombres aléatoires. Plutôt que de reposer sur un générateur de nombres aléatoires (utilisant l'algorithme Mersenne Twister) globalement initialisé, l'API orientée objet offre plusieurs classes permettant d'accéder à des algorithmes modernes stockant leur état au sein des objets, afin de fournir des séquences d'initialisations bien distinctes.
La classe \Random\Randomizer
fournit une interface de haut niveau permettant, par exemple, de générer un entier aléatoire, mélanger un tableau ou une chaine de caractère, et plus encore.
trait Foo
{
public const CONSTANT = 1;
}
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error
class User
{
public $name;
}
$user = new User();
$user->last_name = 'Doe';
$user = new stdClass();
$user->last_name = 'Doe';
class User
{
public $name;
}
$user = new User();
$user->last_name = 'Doe'; // Deprecated notice
$user = new stdClass();
$user->last_name = 'Doe'; // Still allowed
Afin d'éviter des erreurs, la création des propriétés dynamiques est obsolète, sauf si la classe contient l'attribut #[\AllowDynamicProperties]
. stdClass
autorise les propriétés dynamiques.
L'utilisation des méthodes magiques __get
/__set
n'est pas affectée par ce changement..
mysqli_execute_query
et méthode mysqli::execute_query
.#[\AllowDynamicProperties]
et #[\SensitiveParameter]
.ZipArchive::getStreamIndex
, ZipArchive::getStreamName
, et ZipArchive::clearError
.ReflectionFunction::isAnonymous
et ReflectionMethod::hasPrototype
.curl_upkeep
, memory_reset_peak_usage
, ini_parse_quantity
, libxml_get_external_entity_loader
, sodium_crypto_stream_xchacha20_xor_ic
, openssl_cipher_key_length
.${}
est désormais obsolète.utf8_encode
et utf8_decode
sont désormais obsolètes.DateTime::createFromImmutable
et DateTimeImmutable::createFromMutable
ont comme type de retour provisoire static
.ODBC
et PDO_ODBC
échappent les noms d'utilisateurs et mots de passe.strtolower
et strtoupper
ne sont plus sensibles à la locale.SplFileObject::getCsvControl
, SplFileObject::fflush
, SplFileObject::ftell
, SplFileObject::fgetc
, et SplFileObject::fpassthru
renforcent leur signature.SplFileObject::hasChildren
a un type de retour provisoire false
.SplFileObject::getChildren
a un type de retour provisoire null
.SplFileInfo::_bad_state_ex
est désormais obsolète.