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
y true
como tipos independientes 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();
}
La extensión "random" proporciona una nueva API orientada a objetos para la generación de números aleatorios. En lugar de depender de un generador de números aleatorios (RNG) globalmente sembrado utilizando el algoritmo Mersenne Twister, la API orientada a objetos proporciona varias clases ("Engine") que proporcionan acceso a algoritmos modernos que almacenan su estado dentro de objetos para permitir múltiples secuencias sembrables independientes.
La clase \Random\Randomizer
proporciona una interfaz de alto nivel para utilizar la aleatoriedad del motor para generar un número entero aleatorio, para mezclar un array o cadena, para seleccionar claves de array aleatorias y más.
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
La creación de propiedades dinámicas está en desuso para ayudar a evitar errores y errores tipográficos, a menos que la clase opte por usar el atributo #[\AllowDynamicProperties]
. stdClass
permite propiedades dinámicas.
El uso de los métodos mágicos __get
/__set
no se ve afectado por este cambio.
mysqli_execute_query
y método mysqli::execute_query
.#[\AllowDynamicProperties]
y #[\SensitiveParameter]
.ZipArchive::getStreamIndex
, ZipArchive::getStreamName
y ZipArchive::clearError
.ReflectionFunction::isAnonymous
y 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
funciones.${}
en desuso.utf8_encode
y utf8_decode
.DateTime::createFromImmutable
y DateTimeImmutable::createFromMutable
tienen un tipo de retorno tentativo de static
.ODBC
y PDO_ODBC
escapan el nombre de usuario y la contraseña.strtolower
y strtoupper
ya no son sensibles al entorno regional.SplFileObject::getCsvControl
, SplFileObject::fflush
, SplFileObject::ftell
, SplFileObject::fgetc
y SplFileObject::fpassthru
aplican su firma.SplFileObject::hasChildren
tiene un tipo de retorno tentativo de false
.SplFileObject::getChildren
tiene un tipo de retorno tentativo de null
.SplFileInfo::_bad_state_ex
ha sido deprecado.