Обновление стандартов PSR-6 и PSR-13, кеширование наследования в опкеш, аксессоры свойств и другие новости из PHP Internals, диалект Lisp компилируемый в PHP, а также инструменты, видео, подкасты и PHP Дайджест Live.
Приятного чтения!
Новости и релизы
- 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 прошлого года:
- 12 февраля, 17:00 — Онлайн митап от ВсеИнструменты.Ру о PHP, MySQL, нагрузках, асинхронности и с крутым составом.
PHP Internals
- [RFC] Warning for implicit float to int conversions
PHP динамический язык, что значит он может менять тип переменной на лету. У такого подхода есть как плюсы, так и минусы.
Например, при преобразовании вещественных чисел (float
) в целые (int
) тихо теряется дробная часть.
3v4l.org/C1bD3function acceptInt(int $i) { var_dump($i); } acceptInt(3.1415); > int(3)
В данном 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.
- [RFC] Enumerations — Стартовало голосование по енамам. Подробнее о предложении можно прочитать в дайджесте №194 или посмотреть в видео дайджест-лайва.
- [RFC] var_representation(): readable alternative to var_export() — Стартовало голосование по добавлению новой функции, которая исправляет проблемы старой
var_export()
. - [RFC] Dump results of expressions in `php -a` — Отклонено.
- Что нового в PHP 8.1 — Пополняющийся пост от Brent Roose. Если хочется прям все-все в подробностях, то лучше смотреть на php.watch.
Следить за новыми RFC и ходом голосований также можно на PHP RFC Watch
Инструменты
- 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.
Symfony
- Неделя Symfony #736 (1-7 февраля 2021)
- Elasticsearch в Symfony – правильный путь
- Symfony и Гексагональная архитектура
- Настройка Github Actions для Symfony проекта
Laravel
- В Laravel добавили параллельный запуск тестов на базе paratestphp/paratest. В тему пост про адаптацию тестов для параллельного запуска.
- Новый релизный цикл Laravel — Мажорная версия теперь будет выходить раз в год вместо 6 месяцев. Актуальные версии и расписание есть на laravelversions.com.
- Мощный Illuminate Request
- Настройка Xdebug 3 для Laravel-приложения в Docker
- Как подружить ltree и Laravel
- Laravel–Дайджест (25 января – 7 февраля 2021)
- Laravel Worldwide Meetup #5: Hotwire в Laravel, мультиприложение в одной БД.
Yii
- Свежие релизы пакетов Yii 3: yiisoft/request-body-parser, yiisoft/cache, yiisoft/arrays.
Статьи
- Вебшел скрывался в зараженном PHP-скрипте в виде пробельных символов — Анализ бекдора, найденного на взломанном сервере.
- Бенчмарки различных фреймворков и CMS на PHP версий 5.6, 7.* и 8.0.
- Enum в PHP 8.1 — для чего нужен enum, и как реализован в PHP.
- Паспортный контроль, или как сжать полтора гигабайта до 42 мегабайт.
- А такой ли уж анти-паттерн этот Service Locator?
Аудио/Видео
- Почему работа с легаси может быть увлекательной — Сергей Жук из Skyeng рассказывает какие есть варианты действий, если пришел на проект с кучей легаси.
- О создании генеративного арта с помощью PHP и попутно о профилирования с Blackfire.io.
- Refactoring PHP Platform — LiveStream #3 — Летсплей от Christoph Rumpel.
- PHP Release Radar — Episode 3: Psalm 4 — Интервью с автором Psalm.
- PHP Release Radar — Episode 4: Xdebug 3 — C автором отладчика Derick Rethans.
- PHP Internals News podcast #73 — C Larry Garfield про енамы.
- PHP Internals News podcast #74 — Про файберы с автором предложения и мейнтейнером Amp – Aaron Piotrowski.
Занимательное
- 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
fenric
Почему-то напоминает сильно Swift… Интересное предложение, с которым как и в Swift отпадает необходимость в геттерах и сеттерах, но визеры (withers) – не вымещает… Мне лично геттеры/сеттеры кажутся более правильным подходом, почему в Swift и продолжаю их использовать, хотя смысла в этом зачастую просто 0… Интересно было бы глянуть опрос за и против – gettes/setters vs property control среди пользователей...