Релиз языка программирования PHP 8.2

После года разработки представлен релиз языка программирования PHP 8.2. Новая ветка включает серию новых возможностей, а также несколько изменений, нарушающих совместимость.

Ключевые улучшения в PHP 8.2:

  • Добавлена возможность пометки класса доступным только для чтения. Свойства в подобных классах могут быть заданы только один раз, после чего не будут доступны для изменения. Ранее только для чтения могли помечаться отдельные свойства класса, а теперь разом можно включить данный режим для всех свойств класса. Указание флага «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
    
  • Добавлены отдельные типы «true», «false» и «null», которые могут принимать только одно допустимое значение и использоваться, например, для возвращения функцией признака завершения с ошибкой или пустого значения. Ранее «true», «false» и «null» могли использоваться только в связке с другими типами (например, «string|false»), а теперь могут применяться отдельно:
       function alwaysFalse(): false
       {
           return false;
       }
    
  • Предоставлена возможность фильтрации конфиденциальных параметров в данных трассировки стека, выводимых во время ошибки. Вырезание определённой информации может потребоваться когда сведения о возникающих ошибках автоматически направляются в сторонние сервисы, отслеживающие проблемы и информирующие о них разработчиков. Например, можно исключить из трассировки параметры, включающие имена пользователей, пароли и переменные окружения.
       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
    
  • Разрешено определение констант в типажах (trait, механизм для повторного использования кода). Доступ к константам, определённым в типаже, можно получить через класс, который использует типаж (но не через имя типажа).

       trait Foo  
       {
           public const CONSTANT = 1;
    
           public function bar(): int
           {
               return self::CONSTANT; // Fatal error
           }
       }
    
       class Bar
       {
           use Foo;
       }
    
       var_dump(Bar::CONSTANT); // 1
    
  • Добавлена возможность задания типов в дизъюнктивной нормальной форме (DNF, Disjunctive Normal Form), позволяющей совместить объединение и пересечение типов.
       class Foo {
           public function bar((A&B)|null $entity) {
               if ($entity === null) {
                   return null;
               }
               return $entity;
           }
       }
    
  • Предложено новое расширение «Random» c функциями и классами для генерации псеводослучайных чисел и последовательностей. Модуль предоставляет объектно-ориентированный интерфейс, позволяет выбирать разные движки для генерации псеводослучайных чисел, в том числе пригодные для применения в криптографии, и предоставляет вспомогательные функции, например, для случайного перемешивания массивов и строк, выбора случайных ключей массива, одновременного использования нескольких генераторов со своим независимым состоянием.

  • Реализовано независимое от локали преобразование регистра символов. Функции, подобные strtolower () и strtoupper (), теперь всегда преобразуют регистр символов в диапазоне ASCII как при выставлении локали «С».

  • Добавлены новые функции: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
  • Добавлены новые методы: mysqli: execute_query, ZipArchive: getStreamIndex, ZipArchive: getStreamName, ZipArchive: clearError, ReflectionFunction: isAnonymous, ReflectionMethod: hasPrototype.

  • Объявлена устаревшей возможность динамического создания свойств в классе. В PHP 9.0 обращение к свойствам, изначально не определённым в классе, будет приводить к ошибке (ErrorException). Классы, предоставляющие методы __get и __set для создания свойств, или динамические свойства в stdClass продолжат работать без изменений, прекратится поддержка только неявной работы с несуществующими свойствами для того чтобы защитить разработчика от скрытых ошибок. Для сохранения работы старого кода предложен атрибут »#[AllowDynamicProperties]», разрешающий использование динамических свойств.

  • Объявлена устаревшей возможность подстановки значений переменных в строки при помощи выражений »${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"]
    



Источник: http://www.opennet.ru/opennews/art.shtml? num=58288

© OpenNet