PHP 8.3 (23.11.2023)

Глубокое клонирование readonly-свойств (Появилась возможность однократного переопределения readonly свойств в методе __clone()):

🧩 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_validate() (Проверка корректности json без декодинга)

Быстрая проверка валидности 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() для тестов.

Системный атрибут #[\Override]

Явное указание переопределения метода:

				
					class Child extends Parent {
    #[\Override]
    public function save(): void { ... } 
}
				
			

→ Если метода в родителе нет — CompileError.
→ Помогает при рефакторинге.

Прочее

⚠️ Breaking changes

  • DateTime и DateTimeImmutable — больше не клонируются при передаче в конструктор:
				
					$dt2 = new DateTime($dt1); // раньше — копия, теперь — та же временная зона (но разные объекты)
				
			

mb_detect_encoding() — улучшена точность (может вернуть другой результат).