Свежая подборка со ссылками на новости и материалы. В выпуске:
все про файберы и асинхронный 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: suspendValue 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