Свежая подборка со ссылками на новости и материалы. В выпуске: PHP 7.4 RC6, Symfony 5.0 и 4.4, WordPress 5.3 и другие релизы, об обновлении PSR-стандартов, RFC предложения из PHP Internals, порция полезных инструментов, митапы, видеозаписи, подкасты и многое другое.

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



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



PHP Internals


  • [RFC] Weak maps — В PHP 7.4 была добавлена поддержка слабых ссылок через специальный класс WeakReference. Но в действительности для приложений нужна коллекция WeakMap, которую нельзя реализовать на основе WeakReference. Собственно, её и предлагается добавить.
    Скрытый текст
    $map = new WeakMap();
    $obj = new stdClass();
    $map[$obj] = 42;
    var_dump($map);
    // object(WeakMap)#1 (1) {
    //   [0]=>
    //     ["key"] => object(stdClass)#2 (0) {}
    //     ["value"] => int(42)
    //   }
    // }
    
    // Объект уничтожается здесь,
    // и ключ автоматически удаляется из WeakMap
    unset($obj);
    var_dump($map);
    // object(WeakMap)#1 (0) {
    // }
    
  • [RFC] Implement new DOM Living Standard APIs in ext/dom — Предложение о реализации поддержки нового стандарта DOM в расширении ядра почти принято единогласно.
  • [RFC] Deprecate Backtick Operator (V2) — Отклонено на голосовании.
  • [RFC] Union Types 2.0 — Предложение принято практически единогласно и в PHP 8.0 нас ждут объединённые типы. Синтаксис T1|T2|... можно будет использовать везде, где типы можно указывать сейчас.
  • audio PHP Internals News podcast #36 — О тех RFC, которые не прошли в PHP 7.4.

Инструменты


  • lisachenko/z-engine — Экспериментальная библиотека, которая позволяет используя FFI получить доступ к внутренним структурам самого PHP, таким как zend_class_entry, zval, и подобным, и изменять их в рантайме. Это позволяет делать самые немыслимые манипуляции в рантайме.
  • nette/safe-stream — Библиотека позволяет производить атомарные и безопасные чтение/запись файлов с помощью стандартных функций PHP.
  • krakjoe/ilimit — Расширение позволяет выполнить функцию наложив при этом ограничения на время и память, которые может потребовать вызов.
  • Twig 3.0Под капотом много мелких улучшений, повышена производительность, почищен код.
  • fzaninotto/Faker 1.9 — Более сотни улучшений и исправлений в свежем обновлении инструмента для генерации тестовых данных.
  • cekta/di — Годная реализация PSR-11.
  • tarantool-php/client — PHP-клиент для Tarantool. Бенчмарки PHP синхронных коннекторов для Tarantool запущенных в асинхронном/параллельном режиме с помощью расширений Swoole, Async и Parallel (и их комбинаций). Прислал rybakit.
  • badoo/jira-clienthabr Badoo Jira API Client: магия в Jira на PHP.

Symfony



Laravel



Yii



Async PHP



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



Аудио/Видео


Комментарии (15)


  1. hanovruslan
    25.11.2019 11:23

    Хотел оценить Drift PHP Framework но сайт https://driftphp.com недоступен


    1. greabock
      25.11.2019 11:55

      Хабраэффект, очевидно


      1. berezuev
        25.11.2019 12:51

        Он и до дайджеста не работал.
        Оно и не удивительно, репозиторий с сайтом пустой


    1. greatkir
      25.11.2019 13:28

      (deleted, дубль)


    1. seregazhuk
      25.11.2019 17:15

      Да, сайт ещё пока в разработке. Доступен пока только фреймворк и демо приложение.


  1. laskevych
    25.11.2019 18:19
    +1

    Спасибо ;) Как всегда на высоте ;)


  1. shandy
    25.11.2019 22:26
    +2

    Темпы развития языка впечатляют. 10 лет развития от PHP5 то PHP7 версии и всего 5 лет (тьфу-тьфу) от PHP7 до PHP8 версии, причем за 5 лет было/будет сделано больше чем за предыдущие 10.
    Конечно, всегда хочется большего (дженерики, асинхронность) но и без этого PHP это уже не язык для «домашних страниц»)


    1. SerafimArts
      26.11.2019 03:25
      +1

      С этими "хотелками" всё довольно сложно… В PHP типизация чекается в рантайме, так что...


      PHP 7.3) Представим, что нужно проверить возвращаемый T, раньше (т.е. php 7.3 и ниже) мы максимум что делали — это ассерт на то, что значение является T.


      PHP 7.4) Сейчас надо проверить что значение — это instanceof T, т.е. построить цепочку зависимостей [T -> parent of T -> parent of parent of T -> etc.]


      PHP 8.0) Юнион типы: А теперь представим, что возвращаемый T — это T = X | Y. В этом случае нужно уже на уровне языка строить граф, где [T -> X + Y -> parent of X | parent of Y -> etc]


      Ideal PHP) А теперь представим что будет с дженериками, когда этот граф не только километровый (но всё же который можно закешировать), но ещё и создаётся в рантайме! Когда new Some<Any> просто берёт и перекраивает его налету, меня всё внутри. И это я уж не говорю про то, что после юнионов 7.4 планируется добавление декларации этих юнионов через конструкции type T = X | Y;


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


      1. shandy
        26.11.2019 15:10

        Так как раз вот тут и должна JIT компиляция помочь? Тут же как раз про яйцо и курицу, JIT сейчас ничего не привносит, а дженерики наоборот привнесут даунгрейд производительности. Что первое внедрять? )


  1. istepan
    26.11.2019 08:15

    PHP8 будет новой вехой.

    Ещё бы параметры в стандартных функциях привели в порядок.
    Ну и тернарный оператор за одно, если ломать совместимость.


    1. t_kanstantsin
      26.11.2019 10:50
      +1

      Тернарный оператор уже: https://wiki.php.net/rfc/ternary_associativity


    1. evgwed
      27.11.2019 11:00

      Не получится ли как с python2 и python3? Комьюнити явно не оценит поломку обратной совместимости.

      P.S. Если уже ломать обратную совместимость, я бы еще иммутабельность завёз.


      1. istepan
        27.11.2019 11:03

        Да, к сожалению так и выйдет. Тогда можно сделать отдельный класс со статичными методами, по аналогии с DataTime.


        1. evgwed
          27.11.2019 11:17
          +1

          Возможно будет лучше. Я бы с радостью пользовался классом Array, который делает нормальный порядок аргументов для привычных методов. А то сейчас это просто мешанина, где нужно помнить каждый аргумент в каком порядке передавать. Пример:

          array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) : bool
          и
          array_map ( callable $callback , array $array1 [, array $... ] ) : array


          В array_walk идет первый массив, а затем функция, а в array_map наоборот.

          А вообще, было бы здоров не только статику делать по типу:
          Array::map(callable $callback , array $array1)


          Было бы круто делать так:
          $list = [1, 2, 3];
          $result = $list->map(fn($item) => $item * 2);


          1. istepan
            27.11.2019 11:25

            Ссылки ещё забыл упомянуть.