В PHP 8.1 будет enum, и еще два принятых, два отклоненных и три новых RFC предложения для PHP 8.1. WordPress используется на 40% сайтов. Почему нужно убрать strict_types, почему не стоит использовать empty(), а также инструменты, видео, статьи, подкасты, и PHP Дайджест Live в 20:00 МСК.
Приятного чтения!
Новости и релизы
- PhpStorm 2021.1 EAP
Продолжается программа раннего доступа IDE. В этом релизе фокус на стабильности и производительности, поэтому новых фич будет меньше. Тем не менее уже можно пощупать: новые инспекции и квик-фиксы, превью HTML в редакторе, и прочее.Также начиная 2020.3.1 теперь доступны аудио/видео звонки во время сессии совместного программирования через Code With Me.
- xdebug.cloud
Новый платный сервис от автора Xdebug, цель которого — упростить отладку PHP-приложений в более сложных сетевых конфигурациях, например, когда используется Docker, Vagrant, облачные сервисы. - Доля WordPress перевалила за 40% среди топ 10 млн сайтов — Подробнее о методологии используемой w3techs и исторический тренд.
- Каким будет 2021-й год для PHP? — 27 февраля проведем большой стрим.
- 25 февраля, 19:00 МСК онлайн митап от PHP of By. Будет воркшоп «Описываем сложные бизнес-процессы на PHP» от Антона Титова про temporal.io.
- Список всех ближайших мероприятий всегда доступен на phpcommunity.ru.
PHP Internals
- [RFC] Enumerations
С результатом 44 против 7 голосование завершено. В PHP 8.1 будет enum.enum RfcStatus { case Draft; case UnderDiscussion; case Accepted; } function setRfcStatus(RfcStatus $status) :void { // ... } setRFCStatus(RfcStatus::Accepted); // Ок setRFCStatus('Draft'); // TypeError
Подробнее про инамы можно прочитать в пересказах RFC в статье Брента и еще подробнее на php.watch.
В Symfony уже открыли тикеты для добавления поддержки инамов.
- [RFC] Deprecate passing null to non-nullable arguments of internal functions
В текущих версиях PHP стандартные функции без ошибок принимаютnull
в качестве аргумента, когда параметр неnullable
.А начиная с PHP 8.1 встроенные функции тоже будут бросать
TypeError
. Например,str_contains("", null)
. 3v4l.org/OVoa0A.Интересный факт: предложение принято единогласно, притом что это довольно крупная поломка обратной совместимости в PHP.
- [RFC] Array unpacking with string keys
Предложение принято и в PHP 8.1 будет работать распаковка любых массивов, в том числе со строковыми ключами:$array1 = ['a' => 'apple', 'p' => 'pear']; $array2 = ['b' => 'banana', 'o' => 'orange']; $array = [...$array1, ...$array2]; // Приблизительно то же самое что: $array = array_merge($array1, $array2);
- [RFC] Fibers
Из предложения по файберам был убран планировщик, потому что он сильно усложнял реализацию и вероятность принятия предложения.Теперь Fiber API предоставляет самый минимум и похож на аналогичные возможности в Ruby.
Пример использования с ReactPHP trowski/react-fiber:
Скрытый текст$loop = new FiberLoop(Factory::create()); $browser = new Browser($loop); $request = function (string $method, string $url) use ($browser, $loop): void { /** @var Response $response */ $response = $loop->await($browser->requestStreaming($method, $url)); /** @var ReadableStreamInterface $stream */ $stream = $response->getBody(); $body = $loop->await(Streambuffer($stream)); var_dump(sprintf( '%s %s; Status: %d; Body length: %d', $method, $url, $response->getStatusCode(), strlen($body) )); }; $requests = []; $requests[] = $loop->async($request, 'GET', 'https://reactphp.org'); $requests[] = $loop->async($request, 'GET', 'https://google.com'); $requests[] = $loop->async($request, 'GET', 'https://www.php.net'); $loop->await(Promiseall($requests));
- [RFC] CachedIterable (rewindable, allows any key&repeating keys)
Tyson Andre предлагает добавить кеширующий итератор. Он сохраняет состояние любого итератора и внутри себя содержит иммутабельные копии его ключей и значений. - Proposal: namespace the SPL
Обсуждается предложение создать неймспейсSpl
и создать в нем алиасы для существующих классов:SplFixedArray
->SplFixedArray
. А все новые классы, такие какCachedIterable
иReverseIterator
уже вносить сразу в новый неймспейс.А пока в качестве альтернативы есть отличный инструмент azjezz/psl.
- [RFC] mysqli bind in execute
Kamil Tekiela продолжает инициативу по улучшениюmysqli
. В этом RFC предлагает добавить новый необязательный параметр вmysqli_stmt::execute()
. Он будет принимать массив значений, которые автоматически биндятся, вместо отдельного вызоваmysqli_stmt::bind_param()
. К слову, сейчас bind_param принимает только переменные по ссылке. - [RFC] PHPiterableany() and all() on iterables — Предложение добавить функции
any()
иall()
для итераторов не прошло голосование. - [RFC] var_representation(): readable alternative to var_export() — Идея добавить альтернативу для
var_export
не нашла поддержки, поэтому пока используем юзерленд альтернативу brick/varexporter. - [Draft] Unify PHP's typing modes — В PHP по сути есть два режима типизации. Один — слишком слабый, а другой, –
strict_types=1
– слишком строгий. Этот документ описывает причины существования этих двух режимов, их недостатки и что нужно сделать, чтобы объединять оба режима.Документ написан George Peter Banyard, и пока он не планирует его выдвигать в качестве официального RFC.
Разберем его положения на стриме.
- Об Observer API в PHP 8 — Статья о внутреннем API для отслеживания входа и выхода из функции. Он существенно упростил разработку расширений типа Xdebug, профайлеров и APM-решений New Relic, Tideways, и т.п.
Инструменты
- renoki-co/php-k8s — Позволяет управлять ресурсами кубернетиса из PHP.
- marcocesarato/php-conventional-changelog — Генерирует changelog из сообщений коммитов.
- andrey-helldar/package-wizard — CLI-инструмент для создания начальной структуры пакетов.
- rryqszq4/ngx_php7 — Встраиваемый в nginx интерпретатор PHP. Позволяет создавать обработчики запросов на PHP, модифицировать запрос/ответ, фильтровать тело ответа и заголовки, и прочее.
Symfony
- symfony/panther 1.0 — Компонент Symfony на основе Selenium WebDriver для E2E тестирования и скрапинга.
- Tobias Nyholm: Как эффективно использовать компонент Symfony Lock на примере с Messenger
- Аутентификация и авторизация пользователей с общей сессией в микросервисах.
- Неделя Symfony #738 (15-21 февраля 2021)
Laravel
- Тестирование middleware в Laravel.
- Тред с советами по перфомансу Laravel.
- Laravel Internals #4 — Созвон команды Laravel.
- Laravel–Дайджест (8–21 февраля 2021)
Yii
- Пачка релизов компонентов Yii 3: yiisoft/files, yiisoft/var-dumper, yiisoft/auth-jw, yiisoft/log, yiisoft/event-dispatcher.
Async PHP
- swow/swow — Расширение для PHP, которое предоставляет асинхронные возможности на базе libuv, включая асинхронный стрим, то есть из коробки работающие PDO, file_get_сontents() и т.п. (когда они обернуты в корутину). По сути, является минималистичным подмножеством Swoole.
PhpStorm
- Как делать рефакторинг в PhpStorm от Christoph Rumpel.
- 26 трюков и советов по PhpStorm
Статьи
- Как защититься от Dependency Confusion в PHP.
- Benjamin Eberlei: Когда использовать empty() в PHP? Я бы сказал никогда.
- Введение в мутационное тестирование на PHP — Тестируем тесты.
- MySQL под нагрузкой > 40000 QPS, что может пойти не так — Прислал Кирилл Егоров.
- Решаем проблемы с интерпретацией ошибок в сервисной архитектуре.
- Рефакторинг пет проекта: докеризация, метрики, тесты.
- Невидимые символы, скрывающие веб-шелл в зловредном коде на PHP.
- SafetyNet Attestation — описание и реализация проверки на PHP.
- Tagged Unions в PHP (примерно как в Rust).
- Дмитрий Елисеев: Структуры с процедурами или объекты?
Аудио/Видео
- Как регистрировать и тестировать shutdown функции — Новый ролик от Валентина Удальцова (Пых) на канале PHP Point.
- Мифы о производительности приложений на PHP (Роман Ананьев, Simtech Development)
- Онлайн митап от ВсеИнструменты.Ру о PHP, MySQL, нагрузки и асинхронность.
- Пятиминутка PHP №85 — Про карьерный рост от CTO до разработчика «руками», Apache Camel, PHP и ещё 4 языка с Евгением Сальниковым, тимлидом команды доставки в Lamoda.
- PHP Release Radar #5 — Про Flysystem 2 с ее автором Frank de Jonge.
- PHP Internals News podcast с Никитой Поповым про принятые RFC для PHP 8.1: deprecate null, and array unpacking, restrict globals usage, and phase out serializable.
Занимательное
- mario-deluna/php-render — 3D рендерер на чистом PHP, даже без использования FFI. Шейдеры, парсер .obj файлов и прочее.
Код примера:
Уже традиционный стрим по мотивам PHP Дайджеста. Будет разбор новостей и ссылок из выпуска с подробностями и дополнительными деталями.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 198
Автор: Роман Пронский