PHP-Дайджест № 187 (18 августа – 7 сентября 2020)


    Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 8 beta 3, принят новый синтаксис атрибутов в PHP 8, Zephir всё, целая пачка полезных инструментов, статьи, видео, подкасты.

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



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


    • PHP 8 beta 3 — Последняя бета в цикле. Следующим релизом станет RC 1, который ожидается 17 сентября.
    • PHP 7.4.10, PHP 7.3.22
    • Будущее Zephir и Phalcon — Один из контрибьюторов языка Zephir и PHP-фреймворка Phalcon ушёл из проекта, поэтому активная разработка Zephir приостановлена, а Phalcon 5 планируется переписать на чистый PHP.
    • В WordPress сообществе обсуждается план по поддержке версий PHP. Судя по ответам лидера проекта Matt Mullenweg, PHP 5.6 будет поддерживаться еще долго. По официальной статистике PHP ≤5.6 используется на 21.6% установок WP.

    PHP Internals


    • check [RFC] Shorter Attribute Syntax Change — Наконец-то закончилась эпопея с синтаксисом для атрибутов. На переголосовании принят вариант #[Attribute].
      #[
        ORM\Entity,
        ORM\Table("user")
      ]
      class User
      {
          #[ORM\Id, ORM\Column("integer"), ORM\GeneratedValue]
          private $id;
      
          #[ORM\Column("string", ORM\Column::UNIQUE)]
          #[Assert\Email(["message" => "The email '{{ value }}' is not a valid email."])]
          private $email;
      }
      

      Кстати, предыдущий синтаксис с @@Attr не поддерживал группировку атрибутов и поэтому такая возможность была убрана из PR. Но поскольку у #[ ] есть маркер конца, то группировку он поддерживает и она была возвращена.

      // Можно и так
      #[ORM\Entity]
      #[ORM\Table("user")]
      
      // и так
      #[
          ORM\Entity,
          ORM\Table("user")
      ]

      Подробнее об атрибутах было в посте.
    • new [RFC] any() and all() on iterables — Предлагается добавить две новых функции в стандартную библиотеку:
      any(iterable $input, ?callable $callback = null): bool — запустит колбек на каждом элементе и остановится, на первом, который вернет true.
      all(...) — вернет true только, если колбек вернет true для каждого элемента.

      Пример использования:

      // Было
      $satisifes_predicate = false;
      foreach ($item_list as $item) {
          if (API::satisfiesCondition($item)) {
              $satisfies_predicate = true;
              break;
          }
      }
      if (!$satisfies_predicate) {
          throw new APIException("No matches found");
      }
      
      // Стало
      if (!any($item_list, fn($item) => API::satisfiesCondition($item))) {
          throw new APIException("No matches found");
      }

    Инструменты


    • Pest 0.3 — Обертка над PHPUnit, которая позволяет писать тесты в более простом виде. Также готов плагин для PhpStorm Pest IntelliJ.
    • Codeception/Verify 2.0 — Ассершены для PHPUnit и Codeception с fluent-интерфейсом.
    • ramsey/composer-repl — Добавляет команду composer repl для запуска bobthecow/psysh.
    • brick/money — Библиотека для работы с денежными данными. Работает, даже если не установлены GMP или BCMath. Сравнение с moneyphp/money.
    • bassim/super-expressive-php — Библиотека позволяет описывать регулярные выражения почти-естественным языком через текучий интерфейс. Альтернатива VerbalExpressions/PHPVerbalExpressions.
    • phpsci/phpsci-carray — Расширение PHP для научных вычислений. Основано на NumPy.
    • github.com/phpwebclient — Декораторы и хелперы для PSR-18 совместимых HTTP-клиентов.
    • hamlet-framework/type — Библиотека для спецификации типов. Может быть использована везде, где нужна спецификация типов, включая cast, assert, instanceof и т. п.

    Symfony



    Laravel



    Yii


    • yiisoft/auth — Свежий пакет из семейства Yii 3 предоставляет различные методы аутентификации, набор абстракций для реализации в приложении, и PSR-15 middleware для аутентификации.
    • yiisoft/strings — Хелперы для работы со строками.

    Async PHP



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



    Аудио/Видео







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

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

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

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

    Похожие публикации

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 4 934 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

      0
      Спасибо за подборку! Не понятно из поста, увидим ли мы атрибуты в 8.0?
        +2

        Сейчас (PHP 8.0 <= beta3) можно использовать <<Attr>>, дальше (PHP 8.0 >= RC1) будет синтаксис #[Attr].


        P.S. https://externals.io/message/111630 (см. последний коммент)

        +4
        any() and all() — Наконец-то. А то
        $satisfies_predicate = true;
        break;
        Прям какой-то goto. Да ещё и с бесполезной переменной.
          +8

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


              private function any(array $array, callable $fn): bool
              {
                  foreach ($array as $item) {
                      if ($fn($item)) {
                          return true;
                      }
                  }
          
                  return false;
              }
          
              private function all(array $array, callable $fn): bool
              {
                  foreach ($array as $item) {
                      if (!$fn($item)) {
                          return false;
                      }
                  }
          
                  return true;
              }
          +5

          Всё же foreach приводить как альтернативу all/any не очень корректно, когда array_reduce/filter в PHP3 ещё были, если не раньше. Кто по функциональщине хоть чуть-чуть упарывался через них реализовывал, банально что-то вроде


          function array_any(iterable $input, callable $callback)
          {
            return count(array_filter($input, $callback)) > 0;
          }
          
          function array_all(iterable $input, callable $callback)
          {
            return count(array_filter($input, $callback)) === count($input);
          }

          А кто не упарывался, тот и не будет использовать )

            +7

            В этой реализации нет досрочного выхода и она будет запускать callback на всю коллекцию даже если после первого элемента можно было вернуть результат, так что реализация из поста выглядит более корректной.

              –4

              ФП подход в PHP не для скорости используют.

            +2
            Для тех кто под линой и докером, хочет без боли ввиде назначений айпи юзать дебаг, используйте такую точку входа контейнера
            Код
            #!/bin/sh
            set -e
            
            HOST_DOMAIN="host.docker.internal"
            if ! ping -q -c1 $HOST_DOMAIN > /dev/null 2>&1
            then
                HOST_IP=$(ip route | awk 'NR==1 {print $3}')
                # shellcheck disable=SC2039
                echo -e "$HOST_IP\t$HOST_DOMAIN" >> /etc/hosts
            fi
            
            # first arg is `-f` or `--some-option`
            if [ "${1#-}" != "$1" ]; then
                set -- php-fpm "$@"
            fi
            
            exec "$@"
            


            Точка работает для элпайновых образов, как обстоят дела у других не проверял
              0
              А простой «xdebug.remote_connect_back=On» случайно не эту же задачу решает?
                0
                Он частично решает и то с некоторыми оговорками, да и при cli режиме работать уже не будет
                  +1
                  А вы не пробовали в xdebug.remote_host писать docker0 хоста? У меня всё отлично работает и не нужно извращаться.
                    +1
                    В каждой сети он разным может быть
                      0
                      Наверное мы о разных вещах говорим, но допустим, я себе прописал в конфиг
                      docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
                      {
                        "bip": "170.0.0.1/16"
                      }
                      

                      Теперь у меня всегда ip бриджа одинаковый и во всех контейнерах просто пишу xdebug.remote_host=170.0.0.1. Я не очень разбираюсь в сетях, могу что-то путать. Xdebug работает отлично для fpm & cli
                        0
                        Теперь вам надо добавить в заметку к проекту, чтоб в усех работал дебаг, сделайте то и то… Скрипт решает это всё автоматически при старте контейнера, есть еще вариант кроме фиксации айпи докера просто узнать его айпи и прописать в конфиге, но опять же это мартышкин труд)
                          +2
                          С неподдельным интересом наблюдаю за этим полным драматизма тредом, пытаясь понять, что за хитрый use case решается то одним методом хитрых приседаний, то другим. Уже много лет как: на линухе — remote_connect_back = On, на маке — Off, но добавляем remote_host = docker.что-то.internal (вроде так, не помню). И всё работает! Естественно, эти специфичные для ОС вещи вытаскиваются на уровень env для Docker Compose, протягиваются на этап билдинга имиджей и на выходе получаем нужным образом сконфигурированный PHP с xdebug'ом. Нужно CLI? Ну запускайте CLI из шторма, указывая ему remote interpreter в нужном контейнере. Что я делаю не так всё это время?
                            0
                            > remote_host = docker.что-то.internal (вроде так, не помню)
                            docker.for.mac.localhost
              +4

              Эх, жаль уникальный Phalcon. Следующий будет чрезвычайно похож на Yii 3, судя по всему. Планы по срокам на него очень оптимистичные, учитывая что Phalcon на зефире будут поддерживать, а количество рук уменьшилось.

                0
                Да Phalcon шустрая штука
                  0

                  Да, она шустрее, но не другой уровень, как у некоторых альтернативных технологий.
                  При этом недостатки довольно существенные, например, внутрь не влезть отладчиком.


                  Фалкон — вещь хорошая, я такое не про все популярные в PHP вещи могу сказать, но у меня не получилось представит задач, где она была бы лучшим выбором.

                    0

                    Во времена PHP5 весьма можно было некоторые задачи ускорить малой кровью.

                  +2
                  Спасибо за отличную подборку. Время бы найти на все

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

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