PHP Дайджест № 202 (1 – 30 апреля 2021)


    Новый тип never будет в PHP 8.1, на обсуждении частичные функции, а также другие предложения и новости из PHP Internals. PHP доступен на Google Cloud Functions, о взломе git.php.net, Laravel Octane, PhpStorm 2021.1 и другие релизы, порция инструментов, видео, подкасты, статьи.

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



    Новости


    • О взломе git.php.net
      В исходники PHP злоумышленники запушили два коммита от имени Расмуса Лердорфа и Никиты Попова. Проблему быстро обнаружили и решили. Зловредный код к юзерам не попал.

      Как оказалось, на сервере git.php.net были разрешены коммиты по HTTPS и использовалась дайджест-аутентификация, которая принимает md5 хэш в качестве секрета. База хэшей всех контрибьюторов была получена злоумышленниками с сервера master.php.net — именно он, по всей видимости, и был взломан первоначально.

      В итоге теперь вся разработка полностью переведена на GitHub, что упрощает жизнь разработчикам языка.
    • PHP 7.3.28, PHP 8.0.5 — Первые релизы после фриза.

    • PHP доступен на Google Cloud Functions
      Serverless платформа от Google Cloud теперь нативно поддерживает PHP. С помощью GoogleCloudPlatform/functions-framework-php/ можно выполнять функции в рантайме на базе PHP 7.4.

      Немного деталей есть в обсуждении на GitHub в репозитории Symfony. С Symfony 5.3 все будет работать благодаря компоненту Runtime, достаточно установить php-runtime/google-cloud.

    • Composer Command Injection Vulnerability
      Уязвимость в Композере затрагивает только системы с установленным Mercurial. Тем не менее стоит незамедлительно обновиться до версий 2.0.13 и 1.10.22, в которых она исправлена. Технический анализ уязвимости.

    • Ближайшие мероприятия:
      • 15 мая (суббота), офлайн + онлайн, Митап казанского PHP-сообщества — Говорим про тесты, трейты, kPHP, devops в монолите и опыт перехода на Go. Ссылка на трансляцию.
      • 28 июня (понедельник), офлайн, Москва, PHP Russia, 2021 — 30 апреля последний день перед повышением цены.

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

    PHP Internals


    • check [RFC] never type
      В PHP 8.1 будет доступен новый тип для возвращаемых значений: never.

      Функция или метод, объявленная с типом never, указывает, что она никогда не вернет значение и либо бросает исключение либо завершается вызовом типа die(), exit(). Такой тип улучшает синтаксический анализ.

      function redirect(string $uri): never {
          header('Location: ' . $uri);
          exit();
      }
      
      function redirectToLoginPage(): never {
          redirect('/login');
      }

      Коротко об этом уже было в телеграме, а подробно можно почитать на php.watch, и послушать audio выпуск PHP Internals News с авторами.

    • check [RFC] Deprecate implicit non-integer-compatible float to int conversions
      В PHP 8.1 при преобразовании float в int, где теряется дробная часть, будет брошено предупреждение E_DEPRECATED. А в PHP 9.0 будет уже TypeError.

      function acceptInt(int $i) {
              var_dump($i);
      }
      acceptInt(3.1415);
      
      > int(3) // Deprecation notice  

      Подробнее в audio выпуске подкаста PHP Internals News.

    • check [RFC] Phasing out Serializable
      В PHP 8.1 интерфейс Serializable объявлен устаревшим. Deprecation notice будет бросаться, когда в классе используется только этот интерфейс, то есть, если в классе дополнительно нет новых магических методов __serialize() и __unserialize().

    • На голосовании выбраны релиз-менеджеры PHP 8.1
      Всего их будет трое: опытный участник core-тимы Joe Watkins (автор pthreads, parallel и pcov), а также два новичка Patrick Allaert (blackfire.io) и Ben Ramsey (автор ramsey/uuid).

      Кстати, среди номинантов был Сергей Пантелеев s_panteleev, организатор BeerPHP Ярославль. Надеюсь, Сергей станет релиз-менеджером PHP 8.2!




      Новые предложения для PHP 8.1:
    • [RFC] Partial Function Application
      Частичное применение (частичные функции) — это когда фиксируются (или биндятся) только некоторые аргументы при вызове функции, а другие остаются в качестве параметров для передачи позже.

      Например, вот полная функция:
      function whole($one, $two) {
          /* ... */
      }

      А вот частичная на ее основе:
      $partial = whole(?, 2);

      В этом случае, сигнатура частичной будет вот такой:
      function($one) {
          /* ... */
      }

      Зачем это нужно?

      Во-первых, теперь можно получить ссылку на любую функцию или метод и применять везде, где ожидается Callable. Например, можно будет делать вот так:
      array_map(Something::toString(?), [1, 2, 3]);
      array_map(strval(?), [1, 2, 3]);
      
      // вместо
      array_map([Something::class, 'toString'], [1, 2, 3])
      array_map('strval', [1, 2, 3]);

      И во-вторых, как следствие, можно будет реализовать pipe-оператор |>:
      $result = "Hello World"
          |> htmlentities(?)
          |> explode(?);

      Посмотреть в действии можно на 3v4l.org.

      Спасибо Larry Garfield, Joe Watkins, Levi Morrison и Paul Crovella за RFC и реализацию.

    • [RFC] Sealed Classes
      В этом RFC предлагается добавить концепцию sealed классов, интерфейсов и трейтов.

      Такие sealed-сущности могут быть использованы только в перечисленном наборе других сущностей.

      Пример для классов:
      sealed class Shape permits Circle, Square, Rectangle {}
      
      final class Circle extends Shape {} // ok
      final class Square extends Shape {} // ok
      final class Rectangle extends Shape {} // ok
      
      final class Triangle extends Shape {} // Fatal error: Class Triangle cannot extend sealed class Shape.

      Предлагаемый синтаксис в точности копирует Java.

    • [RFC] Autoload Classmap — Здесь предлагается расширить дефолтный автозагрузчик, чтоб можно было указать карту классов (массив класс => файл) и немного улучшить производительность. Но предложенные новые функции пока несовместимы с Композером, поэтому стоит ожидать обновленный RFC.
    • [PR] Add support for final constants — Предлагается final для констант, чтоб нельзя было их переопределить в дочерних классах.

    Инструменты



    Symfony


    • symfony/ux-turbo — Не так давно автор Ruby on Rails представил мини JS-библиотеку hotwired/turbo. Ее идея в том, чтобы делать SPA, но при этом минимально писать фронтендный JS-код.

      По сути, на клики и сабмиты делается фоновый AJAX-запрос и подменяется кусок страница без перезагрузки, а URL меняется с помощью pushState. Техника старая, но эффективная.

      UX Turbo — это интеграция для Symfony. Также из коробки предоставляется интеграция с пуш-протоколом Symfony Mercure и можно изменения отображать у всех онлайн-пользователей автоматически.

      Вот тут неплохие слайды с деталями.
    • dykyi-roman/crossword — Игра в кроссворды реализованная, как пример масштабируемой и высоконагруженной архитектуры на Symfony. Прислал Roman Dykyi.
    • End-to-end тестирование с Symfony и Panther.
    • Неделя Symfony #747 (19-25 апреля 2021)

    Laravel



    Async PHP


    • reactphp/http v1.3.0 — HTTP клиент и сервер ReactPHP теперь с поддержкой keep-alive соединений и x2 улучшенной производительностью.
    • WordPress-PSR/swoole — Интересная и даже рабочая попытка запустить WordPress на Swoole.
    • habr Мифы об асинхронном PHP: он не по-настоящему асинхронный.

    phpstorm PhpStorm



    Тестирование



    Статьи



    Аудио/Видео




    Из-за проблем со здоровьем стримы пока на паузе.


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

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

    Комментарии 9

      +1
      Спасибо за тонну полезных ссылок!
      В PHP 8.1 будет доступен новый тип для возвращаемых значений: never.

      Примеры может стоит с never привести? Понимаю что копипаста из RFC, просто диссонанс возникает ;).
        0
        Примеры может стоит с never привести?

        deleted
          +1
          Я имел в виду, что вместо noreturn будет never в примерах из RFC (уже поправили)
          +2

          Поправил, спасибо

          +4
          Из-за проблем со здоровьем стримы пока на паузе.

          Выздоравливай!

          +1
          Рома, с возвращением и поправляйся!
          0

          Сейчас бы в 2021 из функции при помощи exit/die выходить… Какое-то странное продвижение бед практис. Лучше бы на дженериках сосредоточились, ну хоть в каком-то виде, пусть даже без проверок в рантайме.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое