🧩 readonly для классов без конструктора
readonly class Foo {
public function __construct(protected Bar $bar) {}
public function __clone() {
$this->bar = clone $this->bar;
}
}
readonly class Config {
public string $env;
public int $port;
}
// Свойства можно инициализировать при объявлении:
$config = new Config();
$config->env = 'prod'; // ✅ только один раз
Раньше требовался __construct для инициализации readonly-свойств.
Быстрая проверка валидности JSON без парсинга:
if (json_validate($input)) {
$data = json_decode($input);
}
→ В 5–10 раз быстрее json_decode() + null === json_last_error().
🧱 Random\Engine и Random\Randomizer
$engine = new Random\Engine\Mt19937(123);
$random = new Random\Randomizer($engine);
echo $random->getInt(1, 100); // воспроизводимо
→ Замена mt_srand()/rand() для тестов.
Явное указание переопределения метода:
class Child extends Parent {
#[\Override]
public function save(): void { ... }
}
→ Если метода в родителе нет — CompileError.
→ Помогает при рефакторинге.
DateTime и DateTimeImmutable — больше не клонируются при передаче в конструктор:
$dt2 = new DateTime($dt1); // раньше — копия, теперь — та же временная зона (но разные объекты)
mb_detect_encoding() — улучшена точность (может вернуть другой результат).