PHP Дайджест № 200 (22 февраля – 15 марта 2021)

    Фото: Grégoire Gaonach

    Свежая подборка со ссылками на новости и материалы. В выпуске: Объекты в инициализаторах, неймспейсы для расширений, и другие RFC предложения для PHP 8.1. Обновлен PSR-11, предложен PSR ClockInterface. Порция полезных инструментов, видео, подкасты, статьи, и PHP Дайджест Live в 20:00 МСК.

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



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



    PHP Internals


    • [RFC] New in initializers
      В текущих версиях PHP можно использовать только константные значения в инициализаторах, то есть в дефолтных значениях свойств, параметров, констант. Если нужно не константное значение, то свойства инициализируют в конструкторе, а аргументы — в теле методов. С константами таких вариантов сейчас вообще нет.

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

      static $x = new Foo();
      
      const C = new Foo();
      
      #[AnAttribute(new Foo())]
      class Test {
          public const C = new Foo();
          public static $prop = new Foo();
          public $prop = new Foo();
      
          public function __construct(
              private Logger $logger = new NullLogger()
          ) {}
      }
      
      function test($param = new Foo()) {}
      

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

      Документ содержит много подробностей и нюансов. Например, как работает рефлексия, трейты, анонимные классы, использование в атрибутах для решения проблемы вложенности, и прочее. Рассмотрим подробнее на стриме PHP Дайджест Live.
    • [RFC] Namespaces in bundled PHP extensions
      Классы и функции, предоставляемые в PHP, в настоящее время находятся в глобальном пространстве имен. Идея почистить и распределить все по неймспейсам обсуждалась давно.

      В данном RFC предлагается отказаться от префиксов вендоров, в том числе PHP. А неймспейсами должны стать имена расширений. То есть класс OpenSSLCertificate станет OpenSSL\Certificate.

      Пока правда, это касается только новых символов, а миграция существующих в рамках этого RFC не затрагивается. Но в примерах приведены возможные трансформации:
      str_contains() -> String\contains()
      in_array() -> Array\contains().
      Звучит как идея для PHP 9.
    • [RFC] Static variables in inherited methods
      Допустим, есть метод, в котором используется статическая переменная. Если отнаследоваться от класса с этим методом, то для наследника эта статическая переменная будет новой.

      RFC предлагает сделать единственным набор статических переменных для метода, независимо от того наследуется он или нет.
      Скрытый текст
      class A {
          public static function counter() {
              static $i = 0;
              return ++$i;
          }
      }
      class B extends A {}
      
      var_dump(A::counter()); // int(1)
      var_dump(A::counter()); // int(2)
      var_dump(B::counter()); // int(3)
      var_dump(B::counter()); // int(4)
      

    • [RFC] Fibers
      Стартовало голосование по файберам. Подробнее о том, что это было на канале. Если коротко: это небольшое, но важное улучшение генераторов, которое позволит писать асинхронный код на PHP проще. Например, вот так:

      Среди голосовавших против трое мейнтенеров Swoole. Они считают, что в Swoole уже пройден весь путь по асинхронному PHP, а файберы — это попытка начать заново, и их добавление не несет пользы без других компонентов.

      Также против голосовал Joe Watkins, так как по его мнению файберы не обеспечивают использование по полной всем тем, что сегодня может предложить хард/софт. В то время как расширение krakjoe/parallel вполне могло бы.

      Здравое зерно в этих рассуждениях есть, и тем не менее, файберы — реальный шаг в сторону асинхронных возможностей, который не противоречит ни Swoole ни parallel.
    • [RFC] noreturn type
      Авторы Psalm и PHPStan предлагают добавить новый тип в PHP — noreturn.

      Такой тип указывает на то, что функция либо всегда бросает исключение либо завершает выполнение, то есть вызывает exit(), die(), trigger_error().

      function redirect(string $uri): noreturn {
          header('Location: ' . $uri);
          exit();
      }
      
      function redirectToLoginPage(): noreturn {
          redirect('/login');
      }
      

      Подобный тип есть в Hack, в Python, уже давно используется в самих Psalm, PHPStan и в PhpStorm в виде атрибута #[NoReturn] или через exitpoint в .phpstormmeta.php.
    • [RFC] debug_backtrace_depth(int $limit=0): int — Предлагается новая функция debug_backtrace_depth(int $limit=0), которая возвращает текущий уровень глубины стека вызовов. Может быть полезно для отладки рекурсивных функций, например.

      Сейчас можно получить такое же поведение с помощью полифила: count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit=0)).
    • [RFC] println(string $data = ''): int — Предлагается добавить функцию println, которая выведет строку в stdout и завершит ее символом новой строки. Не str_contains(), конечно, но тоже занятно.

    Инструменты



    Symfony



    Laravel



    Yii



    Статьи



    Видео



    audio Подкасты



    Сообщество





    После небольшого перерыва возвращаемся со стримом и ведущим Валентином Удальцовым!

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

    Начало в 20:00 Москва, Минск / 19:00 Киев.


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

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

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

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

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

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