PHP-Дайджест № 155 (22 апреля – 6 мая 2019)


    Свежая подборка со ссылками на новости и материалы. В выпуске: обновления PHP, Codeception 3.0 и другие релизы, короткие лямбды в PHP 7.4 и обзор свежих RFC-предложений из PHP Internals, порция полезных инструментов, и многое другое.

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



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


    • PHP 7.3.5
    • PHP 7.2.18
    • PHP 7.1.29
    • Codeception 3.0 — Улучшенная интерактивная консоль, повторное выполнение шагов, поддержка PHPUnit 8 и другое.
    • spiral/roadrunner 1.4.0 — Обновление сервера приложений, балансировщика и менеджера процессов на Go. В релизе безопасная остановка воркеров, поддержка переменных окружения в конфигах, возможность контролировать воркеры в пуле, и другое. Есть новый сайт roadrunner.dev.
    • PHP Russia 2019 — 17 мая, Москва, Инфопространство. До последнего повышения цен остается всего несколько дней.

    PHP Internals


    • [RFC] Arrow Functions 2.0 — Предложение прошло голосование и принято. Теперь в PHP будут короткие анонимные функции с использованием синтаксиса fn() => и автоматическим захватом переменных из внешнего скоупа по значению:
      $y = 1;
      $fn = fn($x) => $x + $y;
      

      Пока функции могут иметь только одно выражение строго, результат которого и будет возвращён. Многострочные функции, возможно, будут реализованы позже. Хак с использованием оператора && как в JS не сработает:
      Скрытый текст
      andOperator = ($x) => ($y = 10) && $x + $y;
      console.log(andOperator(5)); // 15
      
      $andOperator = fn($x) => ($y = 10) && $x + $y;
      var_dump($andOperator(5)); // bool(true)
      
      Но можно применить хак с использованием end():
      Скрытый текст
      <?php
      
      function last(...$args) {
          return end($args);
      }
      
      $multipleLines = fn($x) => last(
          $y = $x * 10, // 10
          $z = $y + 15, // 25
          $x + $y + $z  // 1 + 10 + 25 результат этого выражения возвращается из last()
      );
      var_dump($multipleLines(1)); // int(36)
      

      Или с помощью array_slice(), спасибо Grikdotnet за наводку:
      Скрытый текст
      $multipleLines = fn($x) => array_slice([
        $y = $x * 10,
        $z = $y + 15,
        $x + $y + $z
      ], -1)[0];
      var_dump($multipleLines(1)); // int(36)
      

    • [RFC] Deprecate PHP Short open tags — В предложении рассматривалась идея убрать возможность использования коротких тегов <?, однако оно было встречено бурей возмущений и споров. Поэтому был предложен гораздо более мягкий путь, в котором в ближайших версиях возможность остаётся доступной как есть, и будет бросаться deprecation warning.
    • [RFC] Spread Operator in Array Expression — Предложение принято практически единогласно. Оператор ... теперь будет доступен в массивах.
      Скрытый текст
      $parts = ['apple', 'pear'];
      $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
      // ['banana', 'orange', 'apple', 'pear', 'watermelon'];
      
      Также с помощью него можно быстро преобразовать итератор в массив вместо использования iterator_to_array:
      $array = [...$iter];
      
    • RFC: Allow throwing exceptions from __toString() — Никита продолжает систематически исправлять «грусти PHP» одну за одной. На этот раз речь идёт о возможности бросать исключение в __toString(). Ещё одно приятное и совсем не тривиальное улучшение для PHP 7.4, которое избавит от необходимости использовать всякие обходные пути 1, 2.
    • audio PHP Internals News #7 — Derick Rethans общается с Зеевом Сураски о JIT в PHP 8 и более ранних попытках реализации.
    • audio PHP Internals News #8 — Беседа с George Banyard, контрибьютором документации PHP, о коротких тегах.

    Инструменты


    • kalessil/production-dependencies-guard — Пакет предотвращает добавление dev-зависимостей, например, тестовых и отладочных инструментов, в секцию require файла composer.json, а также делает несколько других проверок.
    • jakoch/awesome-composer — Подборка ресурсов и инструментов для Composer.
    • twirphp/twirp — Порт RPC-фреймворка Twirp от Twitch на PHP. Пост в поддержку.
    • EFTEC/BladeOne — Независимая от фреймворка версия Blade в одном файле и без зависимостей.
    • fe3dback/str — Объектная обёртка над string с массой методов для манипуляций и поддержкой многобайтовых строк.

    Symfony



    Laravel



    Yii



    Async PHP



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



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

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

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

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

    Share post

    Comments 12

      0

      О, первый раз услышал как Никита Попов по русски говорит)

        0
        Из всех вариантов коротких лямбд выбрали самый кривой…

        Ну, раз так — то было бы неплохо использовать новое ключевое слово для объявления любых функций, а не только коротких лямбд.

        fn helloWorder() => echo 'Hello world';
        
          0
          Это вообще разные вещи, зачем их рядом ставить?
            0
            В документе есть целая секция с обоснованием выбора синтаксиса wiki.php.net/rfc/arrow_functions_v2#syntax

            а также секция про возможные улучшения в будущем wiki.php.net/rfc/arrow_functions_v2#allow_arrow_notation_for_real_functions
              0
              Вообще, можно было сделать просто fn алиасом на function, получилось бы более консистентно, имхо:
              class X 
              {
                  public fn a() { ... }
                  public function b() { ... }
              
                  public fn c() => ...;
                  public function d() => ...;
              }
              
              $a = function ($x) use ($z) { ... };
              $b = fn($x) use ($z) { ... };
              
              $c = function ($x) => ...;
              $d = fn($x) => ...;
              


              А отличия были бы только в "=>" vs "{}", в первом случае только одно выражение + захват контекста, а во втором много выражений + контекст через use.
                0
                А заодно и use отменить, раз захват контекста без него уже реализовали.
                  0

                  Захват контекста реализован не так, как use. В use можно использовать ссылку и менять исходную переменную. В fn => — по значению.
                  Хотя в rfc описан вариант (я так понимаю, на будущие релизы):


                  $fn = fn() use(&) {
                      // ...
                  };
                    0
                    $x = 1;
                    $y = &x;
                    (fn() => $y++)();
                    echo $x; // 2
                    

                    Не?
                      0
                      Не, будет 1, как $x, так и $y. Пробовал в devilbox/php-fpm-7.4:latest
            +1
            Компилятор PHP, также известный как кроличья нора FFI — Интересный пост о типах компиляторов, принципах их устройства, и собственно о реализации ahead-of-time (AOT) компилятора PHP с использованием LLVM и самого PHP.


            Это самое безумное и охренительное, что я когда-либо видел! А FFI биндинги под llvm с примерами использования вообще бесподобны.
              +1
              $multipleLines = fn($x) => last(


              Зачем объявлять функцию last() и временную переменную для решения проблемы со ссылкой в end()?
              Смысл однострочника — в отсутствии деклараций:

              $x = 1;
              echo array_slice([
                $y = $x * 10,
                $z = $y + 15,
                $x + $y + $z
              ],-1)[0];
              
                0
                Добавил в текст, спасибо за дополнение!

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