Readonly class
En php 8.1 se inclyen las propiedades de solo lectura que permiten que solo el objecto pueda establecer los valores a si mismo. En php 8.2 se puede hacer con respecto a la clase. Lo que nos dice la documentación es que si se marca la clase con el modificador readonly es para todas las propiedades de la clase y además, evita la creación de propiedades dinámicas y va a resultar imposible darles soporte usando AllowDynamicProperties, ya que dará un error en tiempo de compilación.
<?php
#[\AllowDynamicProperties]
readonly class Foo {
}
// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>
Disjunctive Normal Form (DNF) Type
Según el RFC DNF es la forma estandar de organizar expresiones booleanas. Esta funcionalidad nos va a permitir incluir en la declaración de funcionalidades expresiones boolenas para tipos, lo cual nos puede ahorrar código de verificación de tipos. Se ve mejor con un ejemplo:
class Foo {
public function bar((A&B)|null $entity) {
return $entity;
}
}
Allow null
, false
, and true
as stand-alone types
Otra funcionalidad interesante añadida. Antes de esto, si teníamos un método o funcionalidad que tuviera que retornar siempre true (por ejemplo) teníamos que establecer como tipo de retorno el tipo genérico bool. Ahora podemos indicar de forma específica que es lo que tiene que retornar.
class Falsy
{
public function alwaysFalse(): false { /* ... */ *}
public function alwaysTrue(): true { /* ... */ *}
public function alwaysNull(): null { /* ... */ *}
}
New "Random" extension
PHP parece que ha tenido siempre problemas con la implementación de generadores de números aleatorios con RNG. En esta versión nos proporcionan un API de alto nivel para poder manejar diferentes algoritmos modernos.
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();
}
Constants in traits
No permite acceder a la constante directamente del trait, pero permite acceder desde la clase que lo implementa.
trait Foo
{
public const CONSTANT = 1;
}
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error