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

В PHP 8.1 будет enum, и еще два принятых, два отклоненных и три новых RFC предложения для PHP 8.1. WordPress используется на 40% сайтов. Почему нужно убрать strict_types, почему не стоит использовать empty (), а также инструменты, видео, статьи, подкасты, и PHP Дайджест Live в 20:00 МСК.
Приятного чтения!
Новости и релизы
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(Stream\buffer($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(Promise\all($requests));
- [RFC] CachedIterable (rewindable, allows any key&repeating keys)
Tyson Andre предлагает добавить кеширующий итератор. Он сохраняет состояние любого итератора и внутри себя содержит иммутабельные копии его ключей и значений. - Proposal: namespace the SPL
Обсуждается предложение создать неймспейсSpl
и создать в нем алиасы для существующих классов:Spl\FixedArray
→SplFixedArray
. А все новые классы, такие какCachedIterable
иReverseIterator
уже вносит сразу в новый неймспейс.А пока в качестве альтернативы есть отличный инструмент azjezz/psl.
- [RFC] mysqli bind in execute
Kamil Tekiela продолжает инициативу по улучшениюmysqli
. В этом RFC предлагает добавить новый необязательный параметр вmysqli_stmt::execute()
. Он будет принимать массив значений, которые автоматически биндятся, вместо отдельного вызоваmysqli_stmt::bind_param()
. В последний сейчас принимает только переменные по ссылке. [RFC] PHP\iterable\any () 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
Laravel
Yii
Async PHP
- swow/swow — Расширение для PHP, которое предоставляет асинхронные возможности на базе libuv, включая асинхронный стрим, то есть из коробки работающие PDO, file_get_сontents () и т.п. (когда они обернуты в корутину). По сути, является минималистичным подмножеством Swoole.
PhpStorm
Статьи
Аудио/Видео
Занимательное
- mario-deluna/php-render — 3D рендерер на чистом PHP, даже безШейде Шейдеры, парсер .obj файлов и прочее.
Код примера:
Уже традиционный стрим по мотивам PHP Дайджеста. Будет разбор новостей и ссылок из выпуска с подробностями и дополнительными деталями.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 198