PHP Дайджест № 201 (15 – 29 марта 2021)
Свежая подборка со ссылками на новости и материалы. В выпуске: все про файберы и асинхронный PHP, а также новые лямбды, пересечения типов и другие предложения для PHP 8.1. Ближайшие мероприятия, порция полезных инструментов, статьи, подкасты, видео и PHP Дайджест Стрим.
Приятного чтения!
Новости
- Ближайшие мероприятия:
- 8 апреля (четверг), онлайн, Митап про безопасность от томского PHP-сообщества — Доклады от Skyeng, Yii Core Team и Userstory.
- 24 апреля (суббота), офлайн + онлайн, Митап нижегородского PHP-сообщества с участием Валентина Удальцова (Пых/PHP Point). Ссылка на трансляцию.
- 15 мая (суббота), офлайн + онлайн, Митап казанского PHP-сообщества — Говорим про тесты, трейты, kPHP, devops в монолите и опыт перехода на Go. Ссылка на трансляцию.
- 28 июня (понедельник), офлайн, Москва, PHP Russia, 2021.
Полный список всегда доступен на phpcommunity.ru.
Async PHP
- [RFC] Fibers — Файберы будут в PHP 8.1
После долгих обсуждений и споров с мейнтейнерами Swoole предложение по файберам наконец-то принято.
Файбер — это блок кода, у которого есть свой стек (переменные и состояние). Он может быть запущен, приостановлен или прерван полностью в любой момент из основного кода или другого файбера. Их можно применить для реализации зеленых тредов в PHP.
Скрытый текст$fiber = new Fiber(function (): void { $value = Fiber::suspend('suspend'); echo "Value used to resume fiber: ", $value, "\n"; }); $value = $fiber->start(); echo "Value from fiber suspending: ", $value, "\n"; $fiber->resume('resume'); > Вывод этого кода: Value from fiber suspending: suspend Value used to resume fiber: resume
Значит ли это, что в PHP 8.1 будет асинхронность из коробки?
Нет. Для асинхронных штук все еще надо будет использовать ReactPHP, Amp или подобные решения. Но использовать асинхронный код, и особенно интегрировать асинхронные блоки в традиционный код, будет намного легче.Подробнее про файберы можно почитать по ссылкам:
• Fibers — PHP 8.1 — Краткий пересказ RFC о PHP.Watch.
• Файберы PHP: Новый шанс для асинхронного PHP? — Хороший разбор от мейнтейнера ReactPHP про суть файберов и типичные заблуждения.
В PHP 8.1 файберы будут доступны из коробки в виде забандленного расширения ext-fiber. Но также автор говорит, что расширение будет обратно совместимым с PHP 7.2. - Мифы об асинхронном PHP — Сергей Жук рассказывает основы: чем отличается конкурентность от параллельности, потоки и процессы, что такое неблокирующий ввод/вывод. И развенчивает популярный миф от том, что асинхронный PHP не является «по-настоящему асинхронным».
- Asynchronous PHP — Multiprocessing, Multithreading & Coroutines — Еще один пост об основах асинхронности в PHP от участника core team Laravel.
PHP Internals
- [RFC] Auto-capturing multi-statement closures
Сразу два предложения от Larry Garfield и Nuno Moduro по улучшению лямбд.В первом предлагается сделать короткие лямбды многострочными и с автозахватом переменных из скоупа.
То есть сейчас можно вот так:
$y = 1; $fn1 = fn($x) => $x + $y;
или вот так:$fn2 = function ($x) use ($y): int { // ... return $x + $y; };
А предлагается вот так:$c = 1; $foo = fn($a, $b):int { // ... $val = $a * $b; return $val * $c; };
- [RFC] Short Functions
В этом RFC предлагается разрешить использовать стрелочный синтаксис в методах и обычных именованных функциях.// Было function add(int $a, int $b): int { return $a + $b; } // Стало function add(int $a, int $b): int => $a + $b;
Пример с короткими геттерами:Скрытый текстclass Person { public function __construct( private string $firstName, private string $lastName, ) {} public function getFirstName(): string => $this->firstName; public function getLastName(): string => $this->lastName; public function getFullName(): string => $this->firstName . ' ' . $this->lastName; }
Если предложения будут приняты, то синтаксис функций в PHP будет полностью консистентен и описывается вот такимиправилами• Символ=>
указывает выполнить выражение справа во всех случаях (функции, лямбды, массивы, match).
• Скобки{ ... }
обозначает блок кода, в котором может бытьreturn
.
• Ключевое словоfunction
означет что автозахвата переменных нет.
• Ключевое словоfn
обозначает, что выполнится автозахват переменных по значению.
• Функция с именем объявляется глобально на этапе компиляции, Функция без имени объявляется локально как замыкание в рантайме. - [RFC] Deprecations for PHP 8.1
Уже по традиции в каждом релизе часть неконсистентных функций и поведений объявляется устаревшими. В версии PHP 8.1 они будут бросать dreprecation notice, а уже PHP 9 будут удалены полностью.Пока ничего сверхпримечательного:
mysqli::init()
, функции key (), current (), next (), prev (), and reset () на объектах, и много еще подобного. - [RFC] Pure intersection types
В PHP 8.0 были добавлены объединенные типы, а в данном RFC предлагается добавить пересечения типов.Синтаксис вот такой
TypeA&TypeB
и означает, что переменная должна одновременно бытьinstanceof TypeA
иinstanceof TypeB
.class A { private Traversable&Countable $countableIterator; public function setIterator(Traversable&Countable $countableIterator): void { $this->countableIterator = $countableIterator; } public function getIterator(): Traversable&Countable { return $this->countableIterator; } }
Предложение называется pure intersection types, потому что комбинации с union типами не поддерживаются и оставлены на рассмотрение в будущем. - [Draft] Add FPM early bootstrapping mode
В этом черновик Benjamin Eberlei (автор атрибутов в PHP 8) предлагает добавить опциюfpm.bootstrap_file
в которой будет путь к скрипту. Этот скрипт будет выполнен перед тем, как FPM процесс начнет слушать входящие соединения. При этом память и состояния из этого скрипта шарится со сркиптом, который отрабатывает на FPM-соединение, то есть запрос.Другими словами, можно вынести бутстрап часть приложения в отдельный скрипт, который все еще выполняется на каждый запрос, но не в момент, когда устанавливается соединение, а чуть раньше, когда процесс только начинает слушать.
То есть это что-то типа улучшенного auto_prepend_file. - PHP JIT/arm64 port — Ребятки из ARM подключились и делают поддержку PHP JIT на ARM-процессорах.
- [RFC] mysqli bind in execute — Принят.
Инструменты
- PeachPie 1.0.0 — Вот уже 5 лет в рамках проекта PeachPie развивается компилятор PHP под .NET. Предствален стабильный релиз и теперь PeachPie позволяет рассматривать PHP как нативный язык .NET платформы. Применение: миграция приложений, кроссплатформенная разработка, другие экзотические кейсы.
- sj-i/php-fuse — FFI биндинги для libfuse — можно сделать свою виртуальную файловую систему из чего угодно. В примерах есть ФС из PHP массива.
- parsica-php/parsica — Построитель парсеров с необычным синтаксисом:
$parser = between(char('{'), char('}'), atLeastOne(alphaChar()));
- spatie/period — Библиотека позволяет делать сложные сравнения дат, например, найти пересечения периодов, разницу, пробелы, крайние границы и прочее.
- pemistahl/grex — Инструмент написан на Rust, но штука мегаполезная. Генерирует регулярные выражения по входным данным. То есть вводите одну или несколько строк, которые должны проходить регулярку, а на выходе получаете паттерн, котороый нужно слегка подправить.
- i18n Ally JetBrains plugin — Плагин PhpStorm для извлечения захардкоженных строк из Twig и PHP в YAML, JSON и XLIFF файлы. Видеодемо. Один из контрибьюторов плагина Edmund Beinarovic придет на стрим рассказать про плагин подробнее.
Symfony
Laravel
Yii
- yiisoft/html — Еще один пакет из семейства Yii 3. На этот раз для генерирования тегов HTML.
Статьи
Аудио/Видео
Сообщество
Стрим по мотивам PHP Дайджеста вместе со мной сегодня проведет Петр Мязин, автор подкаста Пятиминутка PHP.
Разберем новости и ссылки из выпуска с подробностями и деталями, и пообщаемся с гостем про плагин для PhpStorm i18n Ally.
Начало в 19:00 Москва, Минск, Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 200