Представлен первый альфа-выпуск новой ветки языка программирования PHP 8.2. Релиз намечен на 24 ноября. Основные новшества, уже доступные для тестирования или планируемые к реализации в PHP 8.2:
- Добавленыотдельные типы “false” и “null”, которые могут использоваться, например, для возвращения функцией признака завершения с ошибкой или пустого значения. Ранее “false” и “null” могли использоваться только в связке с другими типами (например, “string|false”), а теперь могут применяться отдельно: function alwaysFalse(): false { return false; }
- Добавлена возможность пометки класса доступным только для чтения. Свойства в подобных классах могут быть заданы только один раз, после чего не будут доступны для изменения. Ранее только для чтения могли помечаться отдельные свойства класса, а теперь разом можно включить данный режим для всех свойств класса. Указание флага “readonly” на уровне класса также блокирует динамическое добавление свойств в класс. readonly class Post { public function __construct( public string $title, public Author $author, ) {} } $post = new Post(/* … */); $post->unknown = ‘wrong’; // Error: Cannot create dynamic property Post::$unknown
- Объявлена устаревшей возможность динамического создания свойств в классе (как “post->unknown” в примере выше). В PHP 9.0 обращение к свойствам, изначально не определённым в классе, будет приводить к ошибке (ErrorException). Классы, предоставляющие методы __get и __set для создания свойств, или динамические свойства в stdClass продолжат работать без изменений, прекратится поддержка только неявной работы с несуществующими свойствами для того чтобы защитить разработчика от скрытых ошибок. Для сохранения работы старого кода предложен атрибут
“#[AllowDynamicProperties]”, разрешающий использование динамических свойств. - Предоставлена возможность фильтрации конфиденциальных параметров в данных трассировки стека, выводимых во время ошибки. Вырезание определённой информации может потребоваться когда сведения о возникающих ошибках автоматически направляются в сторонние сервисы, отслеживающие проблемы и информирующие о них разработчиков. Например, можно исключить из трассировки параметры, включающие имена пользователей, пароли и переменные окружения. function test( $foo, #[SensitiveParameter] $password, $baz ) { throw new Exception(‘Error’); } test(‘foo’, ‘password’, ‘baz’); Fatal error: Uncaught Exception: Error in test.php:8 Stack trace: #0 test.php(11): test(‘foo’, Object(SensitiveParameterValue), ‘baz’) #1 {main} thrown in test.php on line 8
- Объявлена устаревшей возможность подстановки значений переменных в строки при помощи выражений “${var}” и ${(var)}”. Поддержка обычно используемых подстановок “{$var}” и “$var” сохранена. Например: “Hello {$world}”; OK “Hello $world”; OK “Hello ${world}”; Deprecated: Using ${} in strings is deprecated
- Объявлены устаревшими частично поддерживаемые вызываемые объекты (callable), которые могут быть вызваны через “call_user_func($callable)”, но не поддерживают вызов в форме “$callable()”: “self::method” “parent::method” “static::method” [“self”, “method”] [“parent”, “method”] [“static”, “method”] [“Foo”, “Bar::method”] [new Foo, “Bar::method”]
- Реализовано независимое от локали преобразование регистра символов. Функции, подобные strtolower() и strtoupper(), теперь всегда преобразуют регистр символов в диапазоне ASCII как при выставлении локали “С”.
Release.
Ссылка here.