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

Symfony


  • Добавляем symfony/stopwatch во сервисы, не меняя их — О декораторах с помощью Ocramius/ProxyManager.
  • Делаем передачу параметров в Twig с типами
  • Неделя Symfony #743 (22-28 марта 2021)

Laravel


  • Laravel Octane — На Laracon Online Тейлор Отвелл представил универсальный пакет для запуска высокопроизводительного Laravel поверх Swoole или RoadRunner.
  • Laravel Query — Плагин для PhpStorm, который интегрирует Eloquent запросы с инструментами БД — автодополнение таблиц, колонок, и прочее.
  • ryangjchandler/orbit — Драйвер для Laravel Eloquent, чтобы хранить данные в обычных файлах.
  • Время ответа от 100ms -> 40ms -> 1ms или как делать кеширование ответов в Laravel.
  • habr Еще немного про сервисный слой в PHP
  • video Laracasts: Laravel 8 с нуля
  • video Laravel Worldwide Meetup #7
  • habr Laravel-дайджест (8–21 марта 2021)

Yii


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

Статьи


  • Используем монорепозиторий для Composer пакетов
  • Nodes Nodes and the Visitor pattern — Довольно интересный пост о том, когда и как стоит применять графы/деревья и шаблон «посетитель».
  • habr Когда объектов недостаточно.
  • habr Разделение кода и текста: прототип.
  • habr Теория программирования: пакетные принципы и метрики.
  • habr Нам точно нужен фреймворк?
  • habr Как дойти до CQRS, если у тебя PHP

Аудио/Видео


  • videoru Feature Flags для ReactJS и PHP — Как впилить Feature Flags для CI/CD в проект на ReactJS и PHP.
  • audioru Подкаст Между скобок №13 — В гостях Антон Жуков рассказывает про gRPC.
  • audio Подкаст PHP Internals News #79 — C Никитой Поповым про new в инициализаторах.

Сообщество


  • Доступен в продаже новый слоник от phpday:




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

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

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





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

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

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 200
Источник: https://habr.com/ru/post/549462/


Интересные статьи

Интересные статьи

В нашем новом дайджесте модуляризация iOS-приложений и интеграция с Siri, удаление неудаляемых приложений и руководство по стилю Kotlin, уязвимости и рендеринг островов, 10,000 серверов и...
В новом дайджесте проверка иконки сплеша, история одного рефакторинга и одного “однорукого” интерфейса, стандарты code review и обновление Firebase, сетевое мышление, Kotlin Developer Nan...
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него. Читать дальше →
У некоторых бизнес-тренеров в области е-коммерса и консультантов по увеличению интернет-продаж на многие вопросы часто можно слышать универсальную отмазку — «надо тестировать» или другую (чтобы не...
В интернет-магазинах, в том числе сделанных на готовых решениях 1C-Битрикс, часто неправильно реализован функционал быстрого заказа «Купить в 1 клик».