Что нового в PHP 8.2

null, false, true ― cамостоятельные типы

Wiki: https://wiki.php.net/rfc/null-false-standalone-types
Wiki: https://wiki.php.net/rfc/true-type

class Falsy
{
	public function alwaysFalse(): false { /* ... */ *}

	public function alwaysTrue(): true { /* ... */ *}

	public function alwaysNull(): null { /* ... */ *}
}

Динамические свойства класса запрещены

Doc: https://www.php.net/manual/ru/migration82.deprecated.php#migration82.deprecated.core.dynamic-properties
Wiki: https://wiki.php.net/rfc/deprecate_dynamic_properties

Чтобы помочь избежать ошибок и опечаток, больше не рекомендуется определять динамические свойства.

Используйте атрибут #[\AllowDynamicProperties] для класса, когда необходимо разрешить динамические свойства.

В экземплярах stdClass динамические свойства по прежнему разрешены.

class User {
	public $name;
}

$user = new User();
$user->last_name = 'Doe'; // Deprecated notice

$user = new stdClass();
$user->last_name = 'Doe'; // Разрешено

Это изменение не влияет на использование магических методов __get()/__set().

Константы в трейтах

Doc: https://www.php.net/manual/ru/migration82.new-features.php#migration82.new-features.core.constant-in-traits
Wiki: https://wiki.php.net/rfc/constants_in_traits

Нельзя получить доступ к константе через имя трейта, но можно через класс, который использует этот трейт:

trait Foo {
	public const CONSTANT = 1;
}

class Bar {
	use Foo;
}

var_dump( Bar::CONSTANT ); // 1
var_dump( Foo::CONSTANT ); // Error

Заметка встроена в: PHP 5.3 - 8.5 — Синтаксис, Новинки