PHP Дайджест № 201 (15 – 29 марта 2021)

ld1n5zudisrnylf1qk7n_9xka0c.jpeg

Свежая подборка со ссылками на новости и материалы. В выпуске: все про файберы и асинхронный PHP, а также новые лямбды, пересечения типов и другие предложения для PHP 8.1. Ближайшие мероприятия, порция полезных инструментов, статьи, подкасты, видео и PHP Дайджест Стрим.

Приятного чтения!


f574e9991c42407b8fa789a66b854f8d.png Новости


  • Ближайшие мероприятия:
    • 8 апреля (четверг), онлайн, Митап про безопасность от томского PHP-сообщества — Доклады от Skyeng, Yii Core Team и Userstory.
    • 24 апреля (суббота), офлайн + онлайн, Митап нижегородского PHP-сообщества с участием Валентина Удальцова (Пых/PHP Point). Ссылка на трансляцию.
    • 15 мая (суббота), офлайн + онлайн, Митап казанского PHP-сообщества — Говорим про тесты, трейты, kPHP, devops в монолите и опыт перехода на Go. Ссылка на трансляцию.
    • 28 июня (понедельник), офлайн, Москва, PHP Russia, 2021.

    Полный список всегда доступен на phpcommunity.ru.

732rpqll-yvu0hrtaw6yeism-de.png 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.

c9ee7880391644e4aef6cc28ca681ab0.png 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-соединение, то есть запрос.

    Другими словами, можно вынести бутстрап часть приложения в отдельный скрипт, который все еще выполняется на каждый запрос, но не в момент, когда устанавливается соединение, а чуть раньше, когда процесс только начинает слушать.

    sozzm3eldtyfniwkcpzfcz-xwv4.png
    То есть это что-то типа улучшенного auto_prepend_file.

  • PHP JIT/arm64 port — Ребятки из ARM подключились и делают поддержку PHP JIT на ARM-процессорах.
  • [RFC] mysqli bind in execute — Принят.

cf862d9072784d04b621238ec137f2ca.png Инструменты


  • 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 файлы. videoВидеодемо. Один из контрибьюторов плагина Edmund Beinarovic придет на стрим рассказать про плагин подробнее.

96b65e92179a40f2bd1884549973ddd5.png Symfony



314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel



569de4298b764a33894aa517e74324f9.png Yii


  • yiisoft/html — Еще один пакет из семейства Yii 3. На этот раз для генерирования тегов HTML.

329bec7c1e914963a1c5d2f2bfe99995.png Статьи



8dcc236774104f8286a40ceaea553820.png Аудио/Видео



Сообщество




Стрим по мотивам PHP Дайджеста вместе со мной сегодня проведет Петр Мязин, автор подкаста Пятиминутка PHP.

Разберем новости и ссылки из выпуска с подробностями и деталями, и пообщаемся с гостем про плагин для PhpStorm i18n Ally.

Начало в 19:00 Москва, Минск, Киев.

Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 200

© Habrahabr.ru