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


    Свежая подборка со ссылками на новости и материалы. В выпуске: расписание релиза PHP 8, анализ эргономики объектов в PHP и 5 свежих RFC из PHP Internals, немного полезных инструментов, видео, подкасты и многое другое.

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



    PHP Internals


    • Опубликовано Расписание релиза PHP 8 — Первая альфа ожидается 18 июня, а финальный релиз 3 декабря. Подробнее.
    • [RFC] Constructor Property Promotion — Ларри Гарфилд опубликовал подробный анализ эргономики объектов в PHP, в котором делает вывод, что лучше всего было бы сфокусировать на 3х RFC: Constructor Promotion, Named parameters, Compound Property Visibility (раздельное указание модификаторов доступа для чтения и записи {public get, private set}).

      И вот по следам анализа, в данном RFC предлагается разрешить объявлять свойства прямо в конструкторе:

      Вместо такого
      class Point {
          public float $x;
          public float $y;
          public float $z;
      
          public function __construct(
              float $x = 0.0,
              float $y = 0.0,
              float $z = 0.0
          ) {
              $this->x = $x;
              $this->y = $y;
              $this->z = $z;
          }
      }
      

      Можно будет писать:

      class Point {
          public function __construct(
              public float $x = 0.0,
              public float $y = 0.0,
              public float $z = 0.0
          ) {}
      }
      
    • [RFC] Allow trailing comma in parameter list — Ну и в дополнение к предыдущему, предлагается разрешить использовать запятую после последнего параметра в определении функции. Для списка аргументов при вызове функции это уже работает начиная с PHP 7.3.

      Скрытый текст
      class Uri {
          private function __construct(
              ?string $scheme,
              ?string $user,
              ?string $pass,
              ?string $host,
              ?int $port,
              string $path,
              ?string $query,
              ?string $fragment // <-- ARGH!
          ) {
              ...
          }
      }
      
    • [RFC] Stricter type checks for arithmetic/bitwise operators — Этот RFC предлагает выдавать ошибку TypeError, когда арифметический или побитовый оператор применяется к массиву, ресурсу или объекту.

      var_dump([] % [42]);
      // int(0)
      // WTF?
      
    • [RFC] Switch expression — Предлагается разрешить использовать switch в качестве выражения, а не только как управляющую конструкцию:

      $expressionResult = switch ($condition) {
          1 => foo(),
          2 => bar(),
          3, 4, 5 => baz(),
      };
      

      Также RFC предлагает разрешить перечисление возможных значений в секциях case: case 3, 4, 5: break; вместо case 3: case 4: case 5: break;.
    • [RFC] Type casting in array destructuring expressions — Предлагается сделать возможным использование приведения типов при деструктурировании массивов:

      [(int) $now, (int) $future] = ["2020", "2021"];
      
      // По сути то же, что и
      [$now, $future] = ["2020", "2021"];
      $now = (int) $now;
      $future = (int) $future;
      

      Николас Грекас в Твиттере приводит примеры возможного использования такой функциональности, а именно имитации именованных параметров:

      ...[int $i] = ['a' => '123'];
      
      function foo(...[int $i]) {
      }
      
      foo(['a' => '234']);
      

      и быстрого объявления типизированных вложенных структур:

      $var = (Foo) [
          'a' => 123,
          'b' => (Bar) [
              'c' => // ...
          ],
      ];
      
    • Отклонены по результатам голосования: Server-Side Request and Response Objects, Userspace operator overloading, Write-Once (readonly) Properties.

    Инструменты


    • TitasGailius/terminal — Красивая обёртка над symfony/process для запуска внешних команд из PHP.
    • rlanvin/php-ip — Библиотека для работы с IPv4/IPv6 на PHP, вдохновлённая ipaddress из Python.
    • ramsey/collection — Реализация коллекций вдохновлённая Java.
    • clue/graph-composer — Инструмент визуализирует связи между composer-пакетами вашего проекта.

    Symfony



    Laravel



    Yii



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



    Аудио/Видео



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

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

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

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 14

      +1
      По поводу Symfony Messenger на SymfonyCasts есть отличный видеоурок по ним.
      symfonycasts.com/screencast/messenger (не сочтите за рекламу, я к этому ресурсу никакого отношения не имею.

        +1
        если уж на них ссылки на symfony.com, то куда уж больше рекламы)
        –4
        [RFC] Allow trailing comma in parameter list
        Unfortunately, it is currently not possible to place a trailing comma in the parameter list. This breaks uniformity, and results in larger diffs when a new optional parameter is added. Additionally, it is inconsistent with call-sites, which do allow a trailing comma

        Надеюсь, что за это не проголосуют. О какой однородности идет речь? Возможно я просто чего-то не понимаю, но меня дико бесит даже лишняя допустимая запятая в конце массива, а тут еще и в аргументах ее наблюдать :(

          +10

          В аргументах, как и в массивах, завершающая запятая ставится только в случае, если терминалы лексемы находится на отдельных от элемента строках.
          Это позволяет не добавлять запятую при дублировании строки и, как следствие, не учитывать добавленную запятую в системах версионирования. Сравним два диффа


           function foo() {
               return [
                   'baz',
          -        'bar'
          +        'bar',
          +        'qux'
               ];
           }

           function foo() {
               return [
                   'baz',
          +        'qux',
               ];
           }

          Учитывая, что мы просто добавили qux, второй вариант выглядит несколько лаконичнее.

            +3
            О какой однородности идет речь?


            Сейчас можно ставить «лишнюю» запятую в массивах и при вызове методов. Добавление этой фичи как раз и приведёт всё к однородному виду.
              +1
              А вот меня — наоборот. Никонда не приходилось менять поряток строк одним движением, а потом удалять-добавлять запятые?
              0
              завершающая запятая ставится только в случае, если терминалы лексемы находится на отдельных от элемента строках

              По задумке Никиты? Что-то будет мешать ставить заверщающую запятую при инлайновом объявлении?
              Согласен, что диффы станут немного чище, но при этом получаем вот такую картину:


              function foo(string $arg1, int $arg2,) {
                   return [
                       'baz',
                       'qux',
                   ];
               }

              Все еще считаю, что это "расхлебывание" стиля кода.


              ps. простите, промазал веткой

                +5
                Что-то будет мешать ставить заверщающую запятую при инлайновом объявлении?


                С другой стороны, а что мешает вообще весь код писать в одну строчку, без отступов и пробелов? ;)
                  –1

                  К сожалению, ничего не мешает. Я был очень приятно удивлен, когда узнал, что интерпретатор python контролирует отступы и просто не позволяет писать криво.
                  Например, мой друг очень любит выравнивать строки по знаку '=', типа вот такого:


                  public function test() 
                  {
                      $short_var               = 'some text';
                      $long_name_var_full_swag = 'another value';
                  }

                  Меня это просто сводит с ума.

                    +2
                    Не, ну настроить phpcbf в CI или автоформатирование при пулле — это одно из самых простых действий. Не вижу особых проблем.
                +2
                разрешить объявлять свойства прямо в конструкторе:

                Спорное решение. Сейчас конструктор — это обычная функция и к ней применимо всё то же, что и к другим функциям. Приведённый синтаксис превращает конструктор в уникальную семантическую единицу, для которой нужна своя, отдельная логика компиляции и исполнения.

                  0
                  Мне кажется, что она обычная только для пользователя, а на уровне внутренностей интерпретатора для неё и так «отдельная логика компиляции и исполнения».
                    +2

                    Не, самая обычная функция. Единственное различие, что он, как и все магические методы, помимо(?) HashTable function_table кладётся в отдельную переменную zend_function *constructor


                    Т.е. да, когда VM доходит до опкода NEW, то там вершится небольшая магия, но сама функция при этом вызывается и исполняется ровно как любая другая.


                    PS вот не помню, точно ли они кладутся в function_table или только по своим переменным :(

                    0

                    Вспоминаем SRP.
                    С этим нововведением, если нам необходимо поменять модификатор видимости, смотрим diff в конструкторе.

                  Only users with full accounts can post comments. Log in, please.