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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3265
Зарегистрирован: 20.08.2022

#

Релиз языка программирования PHP 8.2
Дата публикации:Thu, 08 Dec 2022 18:56:15 +0300


После года разработки представлен релиз языка программирования 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 функциями и классами для генерации псеводослучайных чисел и последовательностей. Модуль предоставляет объектно-ориентированный интерфейс, позволяет выбирать разные движки для генерации псеводослучайных чисел, в том числе пригодные для применения в криптографии, и предоставляет вспомогательные функции, например, для случайного перемешивания массивов и строк, выбора случайных ключей массива, одновременного использования нескольких генераторов со своим независимым состоянием.

    $rng = $is_production
    ? new Random\Engine\Secure()
    : new Random\Engine\Mt19937(1234);

    $randomizer = new Random\Randomizer($rng);
    $randomizer->shuffleString('foobar');


    Реализовано независимое от локали преобразование регистра символов. Функции, подобные 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"]


    В настройки добавлена директива error_log_mode, позволяющая определить режим доступа к логу с ошибками.


Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=58288

Жизнь за Нер'зула!

Ответить