PHP-Дайджест № 178 (6 – 21 апреля 2020)


    Свежая подборка со ссылками на новости и материалы. В выпуске: Composer 2.0 Alpha и другие релизы, 5 новых и одно принятое RFC предложение из PHP Internals, а также обновленные атрибуты на голосовании, порция полезных инструментов, подкасты, интервью и многое другое.

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


    Новости и релизы



    PHP Internals


    • [RFC] throw expression — Предложение принято и в PHP 8 throw будет не оператором, а выражением. Это значит, что возможно будет бросать исключение в коротких лямбдах, в тернарных операторах и других конструкциях:

      $callable = fn() => throw new Exception();
      
      $foo = $bar['key'] ?? throw new KeyNotSetOnBarException();
      
    • [RFC] Attributes v2 — Предложение по атрибутам (аннотациям) было сильно доработано. В частности, добавлена поддержка нескольких атрибутов с одним именем, атрибуты для параметров функций, разделение на пользовательские атрибуты и атрибуты компилятора, возможность валидация атрибутов компилятора на этапе компиляции. А вот вложенные атрибуты в данной реализации не поддерживаются.

      Судя по ходу голосования, у него все шансы быть принятым. Также на голосование вынесен вопрос о синтаксисе: использовать <<>> или @:.

      Скрытый текст
      <<ExampleAttribute>>
      class Foo
      {
          <<ExampleAttribute>>
          public const FOO = 'foo';
      
          <<ExampleAttribute>>
          public $x;
      
          <<ExampleAttribute>>
          public function foo(<<ExampleAttribute>> $bar) { }
      }
      
      $object = new <<ExampleAttribute>> class () { };
      
      <<ExampleAttribute>>
      function f1() { }
      
      $f2 = <<ExampleAttribute>> function () { };
      
      $f3 = <<ExampleAttribute>> fn () => 1;
      
    • [RFC] PHP Namespace in core, [RFC] PHP Namespace Policy — Сразу два почти идентичных RFC-документа, в которых предлагается использовать неймспейс \PHP в качестве корневого для различных внутренних сущностей, например для планируемых аттрибутов.
    • [RFC] Mixed Type v2 — Сейчас если у функции не указан возвращаемый тип, то непонятно то ли разработчик забыл указать, то ли сознательно не указал по какой-либо причине. К тому же псевдотип mixed уже используется повсюду в документации.

      Предлагается добавить его в PHP 8. Тип mixed будет эквивалентен объединению типов array|bool|callable|int|float|null|object|resource|string.
    • [RFC] non-capturing catches — Предлагается сделать возможным опускать объявление переменной в блоке catch:

      Скрытый текст
      try {
          changeImportantData();
      } catch (PermissionException) { // The intention is clear: exception details are irrelevant
          echo "You don't have permission to do this";
      }
      
    • [RFC] Match expression — Вместо переделывания конструкции switch в выражение предлагается ввести новое выражение match, которое лишено всех недостатков switch, таких как отсутствие проверки типа и возможности возвращать значение. Также в будущем оно может быть дополнено до полноценного паттерн-мэтчинга.

      Скрытый текст
      match ($condition) {
          1 => {
              foo();
              bar();
          },
          2 => baz(),
      }
      
      $expressionResult = match ($condition) {
          1, 2 => foo(),
          3, 4 => bar(),
          default => baz(),
      };
      
    • [RFC] Pipe Operator v2 — Вторая попытка внести оператор |> для последовательного вызова функций c передачей результата предыдущей в качестве аргумента следующей. Семантика полностью копирует реализации в Elixir / JS и от первого варианта (Hack) отличается отсутствием магии использования метки $$.

      $result = "Hello World"
          |> 'htmlentities'
          |> 'explode'
          |> fn($x) => array_map(fn($v) => 'strtoupper', $x)
          |> fn($x) => array_filter(fn($v) => $v != 'O');
      
    • Отклонено: [RFC] Compact Object Property Assignment

    Инструменты


    • jlaswell/compote — Легковесный менеджер зависимостей для PHP написанный на Go. Не призван заменить Composer, а дополняет его для специфичных задач, например, для CI. Сейчас умеет только устанавливать залоченные зависимости.
    • repman.io — Приватный репозиторий пакетов и прокси для Composer.
      Также предоставляет глобальный прокси с CDN для packagist.org, что позволяет ускорить скачивание пакетов.
    • dantleech/what-changed — Плагин для Composer, который сгенерирует отчет со списками изменений в пакетах, обновленных после запуска composer update.
    • maciejczyzewski/bottomline — Аналог lodash / underscore для PHP. Мелкие полезные функции на каждый день для строк/массивов/объектов.
    • VKCOM/noverify v0.2.0 — Статический анализатор для PHP на Go. В релизе улучшена поддержка PHP 7, больше анализаторов, меньше ложных срабатываний.
    • markrogoyski/math-php 1.0 — Первый стабильный релиз математической библиотеки для PHP. Реализованы возможности для работы с матрицами/векторами, численный анализ, статистика и другое. Прислал @dmitrybalabka.

    Symfony



    Laravel



    Laminas



    Async PHP


    • hyperf/hyperf — Фреймворк для создания сервисов на базе корутин Swoole. Прислал @dmitrybalabka.
    • clue/reactphp-flux — Пакет позволяет ограничить количество одновременно выполняемых конкурентных задач в ReactPHP.

    Материалы для обучения



    Аудио/Видео



    Спасибо за внимание!

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

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

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

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

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

      +4
      Pipe оператор — очень круто.
      Но торчащие уши PHP3 одновременно радуют и растраивают.
      Радуют — потому что сильно увеличивают шанс принятия.
      Расстраивают, потому что много бойлерплейта и работы для ИДЕ
      * `|> 'uppercase'` надо и глазами видеть что это функция, а не строка. И ИДЕ хорошо работать с автородсказками
      * `|> [$repository, 'findByUser']` — еще больше нагрузка на глаза и еще больше работы для ИДЕ
      * `|> fn($x) => ...` 10 лишних символов

      А стоило всего-то превратить методы в первых граждан.
        +1
        глобальный прокси с cdn для packagist.org — это то, чего прям не хватало, особенно вечерами. плюс параллельная загрузка из коробки. composer движется в правильном направлении
          +5

          На тему "Правильная регистрация консольных команд Symfony в DI" у меня болело. Не до конца решается проблема в посте. Ещё есть help и description и для них статически описание задать негде… соответственно, при вызове help получаем инициализацию всех зависимостей абсолютно всех консольных команд...

            +1
            Тип mixed, объединяющий множество других типов — чем это функционально отличается от неуказания типа вообще? Строгую типизацию я рассматриваю как в том числе и возможность надеяться на то, что при несоответствии входящего типа интерпретатор упадет с ошибкой. При настолько всеобъемлющих комбинированных типах этот плюс теряется. В RFC это подается как возможность указать, что функция/метод вернет какое-то значение, дабы отличить это от ситуации, когда мы просто забыли указать тип возврата, и противопоставить это отсутствию возврата вообще — но для последнего уже есть: void. Не убедили.
              +4
              это процесс борьбы с легаси.
              Когда ты видишь код без аннотации — эта функция старая или плохо написанная?

              Если же Вы уверены в своем коде и хотите жестких правил — крутите стат.анализ к СИ и не пускайте код без проверок.
                +4
                Иметь mixed хорошо для, скажем, code style automated verification: можно запретить не иметь type-hinting. Сейчас если нет type-hinting, то непонятно: или его забыли, или он mixed.

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

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