PHP Дайджест № 198 (25 января – 8 февраля 2021)

ibmq7sj2bn6vlqyj4_c2t7xojmu.jpeg
Фото: Иван Ганцев.

Обновление стандартов PSR-6 и PSR-13, кеширование наследования в опкеш, аксессоры свойств и другие новости из PHP Internals, диалект Lisp компилируемый в PHP, а также инструменты, видео, подкасты и PHP Дайджест Live.

Приятного чтения!


f574e9991c42407b8fa789a66b854f8d.png Новости и релизы


  • PHP 8.0.2, 7.4.15, 7.3.27
    Обновления включают пачку багфиксов и исправление уязвимости в SoapClient.

    В 7.3 только исправление уязвимости. А PHP 7.2 и более ранние версии PHP уже не поддерживаются и для них не выходят секьюрити фиксы.

  • Опубликованы обновления стандартов PSR-6 и PSR-13.
    Каждый получил по две новых версии, потому что так было определено в плане по модернизации стандартов.

    В обоих случаях первая версия добавляет типы к аргументам, а вторая к возвращаемым значениям. Ну и новые версии требуют PHP 8, потому что используют union типы и static для return type.

    Изменения в PSR-6: 1.0.0 vs 3.0.0.
    Изменения в PSR-13: 1.0.0 vs 2.0.0.

  • Developer Ecosystem 2021 — Опрос сообщества разработчиков от JetBrains
    Довольно длинный, зато включает PHP секцию. Можно посмотреть результаты по PHP прошлого года:
    9dsgeyp-z0hrliqkb10u8i6hy5u.png
  • 12 февраля, 17:00 — Онлайн митап от ВсеИнструменты.Ру о PHP, MySQL, нагрузках, асинхронности и с крутым составом.

c9ee7880391644e4aef6cc28ca681ab0.png PHP Internals


  • [RFC] Warning for implicit float to int conversions
    PHP динамический язык, что значит он может менять тип переменной на лету. У такого подхода есть как плюсы, так и минусы.

    Например, при преобразовании вещественных чисел (float) в целые (int) тихо теряется дробная часть.

    var_dump(3.1415, (int) 3.1415);
    
    > float(3.1415)
    > int(3)
    
    3v4l.org/fP1aC

    В данном RFC предлагается бросать предупреждение, если делается такое преобразование и дробная часть у float ненулевая.

  • Inheritance Cache
    Дмитрий Стогов представил PR, в котором реализовал кеширование наследования.

    Кеш на 8% улучшает производительность «Hello World» приложения на Symfony. И чтоб получить этот прирост, ничего делать не надо будет. Просто обновить PHP и удостовериться, что включен опкеш. Браво, Дмитрий!

    Скрытый текст
    Классы PHP компилируются и кешируются в opcache, но их «связывание» происходит во время выполнения при каждом запросе. Этот процесс может потребовать проведения ряда проверок на совместимость и заимствования методов/свойств/констант из родительских классов или трейтов. Все это требует много времени, хотя результат один и тот же в каждом запросе.

    Кэш наследования выполняет «связывание» набор всех зависимых классов (родительских, интерфейсов, трейтов, тип свойств, и т.п.) один раз и сохраняет в опкеше.

    Кроме того, в рамках этого патча Дмитрий удалил ограничения для неизменяемых классов. И теперь все классы, хранящиеся в опкеше иммутабельны.

  • [RFC] Property Accessors ! ранний черновик!
    Никита создал черновик предложения по аксессорам, то есть возможности объявлять геттеры/сеттеры для каждого свойства отдельно.

    Во-первых, RFC предполагает возможность объявлять асимметричные модификаторы доступа:

    class User {
        public string $name { get; private set; }
    
        // или вот так
        public string $prop { public get; private set; }
    }
    

    Также рид-онли свойства:
    class Test {
        // Read-write property.
        public $prop { get; set; } // равносильно `public $prop;`
    
        // Read-only property.
        public $prop { get; }
    }
    

    Во-вторых, добавлять валидацию с помощью ключевого слова guard.
    class User {
        public string $name {
            guard {
                if (strlen($value) === 0) {
                    throw new ValueError("Name must be non-empty");
                }
            }
        }
    }
    

    В-третьих, ленивую инициализацию с помощью ключевого слова lazy:
    class Test {
        public string $somethingExpensive {
            lazy {
                return computeSomethingExpensive();
            }
        }
    }
    

    В 2013 году подобное предложение уже обсуждалось для PHP 5.5, но провалилось на голосовании.

    Пока это супер ранний черновик, который даже не обсуждался в Internals. На первый взгляд, предложение в текущем виде получается слишком сложным и, возможно, не стоит того. Но черновик просочился даже до публикации, так что посмотрим как он еще изменится.

  • [RFC] Fibers — Продолжается активное обсуждение файберов. Из интересного: к дискуссии подключился один из мейнтейнеров Swoole:
    Once PHP has a stack coroutine like Fiber, we can do more than what we can do now. Since we can interrupt from PHP internal functions, then we can replace all the implementation of PHP blocking functions, such as sleep (), and we can also replace php_stream so that we can change the implementation of PDO, mysqli, and phpredis into a coroutine way, and we can also make curl become a coroutine version through libcurl’s support for multiplexing.
  • twrx6r2xhptg_hfdkhtyg1xfgvc.png[RFC] Enumerations — Стартовало голосование по енамам. Подробнее о предложении можно прочитать в дайджесте №194 или посмотреть в видео дайджест-лайва.
  • twrx6r2xhptg_hfdkhtyg1xfgvc.png[RFC] var_representation (): readable alternative to var_export () — Стартовало голосование по добавлению новой функции, которая исправляет проблемы старой var_export().
  • cross[RFC] Dump results of expressions in `php -a` — Отклонено.
  • Что нового в PHP 8.1 — Пополняющийся пост от Brent Roose. Если хочется прям все-все в подробностях, то лучше смотреть на php.watch.

    Следить за новыми RFC и ходом голосований также можно на PHP RFC Watch


cf862d9072784d04b621238ec137f2ca.png Инструменты


  • vimeo/php-mysql-engine — Симулятор MySQL-запросов (движок) на чистом PHP. В посте про инструмент Matt Brown, автор Psalm, рассказывает, как внедрение этого движка ускорило запуск тестов в Vimeo в два раза.

    На стриме возник вопрос: чем это лучше использования SQLite?

    Простой бенчмарк от Валентина Удальцова (канал Пых) показывает, что инструмент Vimeo заметно медленнее, чем PDO('sqlite::memory:'):

    sqlite:           4.00 MiB  - 66 ms
    php-mysql-engine: 10.00 MiB - 330 ms
    

    Поэтому, если для приложения достаточно подмножества SQLite, то можно остановиться на нем.
  • cweagans/composer-patches — Плагин для Cоmposer, который позволяет применять патчи к зависимостям. Удобно, если ваши изменения специфичные и не имеют смысла в виде полноценного PR для пакета/фреймворка, и на целый форк не тянут.
  • OndraM/ci-detector — Позволяет определить используемый CI-сервер и получить данные о билде.
  • rakibtg/SleekDB — NoSQL база данных на PHP. Данные хранятся в JSON-документах и есть язык запросов
  • Orangesoft-Development/throttler — Балансировщик нод. Пример использования для выбора прокси для Guzzle. Прислал Александр Денисюк.
  • sunrise-php/awesome-skeleton — Микрофрейморк на компонентах для разработки микросервисов и запуске на RoadRunner или Swoole. Прислал fenric.

96b65e92179a40f2bd1884549973ddd5.png Symfony



314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel



569de4298b764a33894aa517e74324f9.png Yii



329bec7c1e914963a1c5d2f2bfe99995.png Статьи



8dcc236774104f8286a40ceaea553820.png Аудио/Видео



cc24d9c95c9841988f8299a8b285e6f6.png Занимательное


  • Phel — Функциональный язык программирования, который компилируется в PHP. Является диалектом Lisp и вдохновлен Clojure. Пример кода:
    Скрытый текст
    # Define a namespace
    (ns my\example)
    
    # Define a variable with name "my-name" and value "world"
    (def my-name "world")
    
    # Define a function with name "print-name" and one argument "your-name"
    (defn print-name [your-name]
      (print "hello" your-name))
    
    # Call the function
    (print-name my-name)
    

Уже пятый выпуск стрима по мотивам PHP Дайджеста будет сегодня на YouTube-канале PHP Point. Разбор новостей и ссылок из выпуска с подробностями и деталями. Новый ведущий, гость в выпуске, и по традиции конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.

Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 197

© Habrahabr.ru