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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Фото: Grégoire Gaonach

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

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



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


  • PHP 8.0.3, PHP 7.4.16.
  • Предложен на рассмотрение новый стандарт PSR ClockInterface
    Интерфейс нужен, чтобы был единый способ получения текущего времени, который можно легко мокать в тестах.

    В черновике следующий вариант:

    namespace Psr\Clock;
    
    interface ClockInterface
    {
        /**
         * Returns the current time as a DateTimeImmutable Object
         */
        public function now(): \DateTimeImmutable;
    }
    
  • Опубликованы обновления стандарта PSR-11 Container Interface — Как и в случае с другими стандартами, выпущены сразу две версии 1.1, в которой добавлены типы параметров, и 2.0 — с возвращаемым типом.
  • Уязвимость в Git clone — Клонирование специально подготовленного репозитория может вызвать выполнение кода во время клонирования без вашего ведома. Рекомендуется обновить Git до 2.30.2.
  • PhpStorm 2021.1 EAP — Программа раннего доступа в самом разгаре: добавили предпросмотр PHP-файлов в редакторе, поддержку JSONPath и video другие улучшения. Как обычно, EAP билды можно использовать бесплатно.
  • Composer 1.x больше не поддерживается — Начиная с мая 2021 доступ к старым API на packagist.org будет ограничен.

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(), конечно, но тоже занятно.

Инструменты


  • spiral/RoadRunner v2.0.0 — Мажорный релиз сервера приложений для PHP на Golang.
  • QratorLabs/Smocky — Обертка над расширением runkit7 mock-ания статических методов с поддержкой PHPUnit и возможностью откатить изменения.
  • Сравнительный обзор библиотек для работы с markdown.
  • phpize.online — Инструмент для шаринга PHP-кода по типу 3v4l.org только с поддержкой SQL.

Symfony


  • symfony/runtime — Новый экспериментальный компонент отвязывает приложение от глобального состояния и позволяет запускать его без изменений на PHP-FPM, CLI, PHP-PM, Swoole и т. п.
  • В Symfony 6 минимальная версия PHP будет 8.0
  • ansien/RapidFormBundle — Пакет для быстрого создания форм в Symfony, используя атрибуты PHP 8.
  • Прагматичная архитектура на Symfony
  • Деплой Symfony приложения в Docker
  • CI/CD пайплайн для Symfony на GitLab
  • Неделя Symfony #741 (8-14 марта 2021)

Laravel


  • Разбор критической RCE уязвимости в Laravel <= v8.4.2 с debug mode — Хитрая атака с использованием file_get_contents / file_put_contents и пассивного режима FTP. А ошибка была в facade/ignition.
  • Закончилась поддержка Laravel 7 — А вот шестая версия фреймворка это LTS и поддерживается до сентября 2022.
  • spatie/laravel-remote — Запускает команды Artisan на удаленном сервере с помощью spatie/ssh. video Стрим с Freek Van der Herten, в котором он разрабатывает пакет c нуля.
  • squirephp/squire — Статические Eloquent модели с полезными данными (список стран, аэропорты, и др.).
  • Пошаговое руководство по созданию первого приложения для Laravel
  • habr Laravel–Дайджест (22 февраля – 7 марта 2021)

Yii


  • habr Новости Yii 2021, выпуск 1
  • Релезы пакетов Yii 3: yiisoft/network-utilities, yiisoft/csrf.

Статьи


  • Полное руководство по FFI в PHP
  • PHP.Watch: Экранирование символов и числовые нотации в PHP.
  • Советы по тестированию на примерах в PHP — Как делать надо и как не надо.
  • Matthias Noback: Как понять где должен быть сервис — на уровне приложения или домена? — Если он будет использоваться на уровне инфраструктуры, то тогда он принадлежит уровню приложения.
  • Бенчмарки PHP на процессорах arm64 vs x86_64 — AWS на ARM дешевле на 20% и в некоторых случаях быстрее.
  • Переход от nginx+fpm к Swoole увеличил производительность нашего PHP API на 91% — История ребяток из github.com/appwrite.
  • Настраиваем отладку в PHP с Xdebug 3, Docker Compose и PhpStorm.
  • Как устроен CI в Laminas — GitHub Actions для поддержки, тестирования и релиза 200+ пакетов.
  • Когда объектов недостаточно — Интересные размышления на тему ООП.
  • habr Run, config, run: как мы ускорили деплой конфигов в Badoo
  • habr Бэкдор во взломанном 1С-Битрикс: под угрозой сотни сайтов
  • habr Как мы быстро распилили монолит, когда командам стало тесно

Видео


  • ru Большой стрим PHP-сообщества — Никита Попов, Александр Макаров, Валентин Удальцов и много других.
  • ru Стрим Дмитрия Елисеева: О сложности домена и о провайдерах в PHP
  • ru Антон Титов: Оркестрируй это! Описываем сложные бизнес процессы на PHP.
  • PHP Release Radar #6: Bref 1.0 — C Matthieu Napoli.

audio Подкасты


  • PHP Internals News #77 — Про добавленную в PHP 8.1 функцию fsync с автором David Gebler.
  • PHP Internals News #78 — C Andreas Heigl о переносе документации PHP в Git. Кстати, если не видели, то у Андреаса был отличный доклад на PHP Russia.
  • ru Пятиминутка PHP №87: PHP в 2021 году
  • ru Пятиминутка PHP №86: План обновления на PHP 8
  • ru Подкаст Между скобок 12: Антон Губарев – Работа архитектора

Сообщество


  • PHP 8 и развитие языка в 30 вопросах и ответах
  • 80+ докладов и статей, которые запомнились PHP-сообществу в 2020 году



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

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

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


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

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

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 199
Источник: https://habr.com/ru/post/547158/


Интересные статьи

Интересные статьи

12 выпусков позади, значит пора немного поменять формат, но внутри вас всё так же ждут исследования, демонстрации, открытые модели и датасеты. Встречайте новый выпуск подборки материа...
В прошлый раз мы поделились настоящим «хабрасериалом» об истории аудиотехники и музыкальной индустрии. Сегодня — продолжим снабжать «читальный зал» избранными статьями о том, как заду...
Но если для интернет-магазина, разработанного 3–4 года назад «современные» ошибки вполне простительны потому что перед разработчиками «в те далекие времена» не стояло таких задач, то в магазинах, сдел...
Несмотря на то, что “в коробке” с Битриксом уже идут модули как для SOAP (модуль “Веб сервисы” в редакции “Бизнес” и старше), так и для REST (модуль “Rest API” во всех редакциях, начиная с...
В нашем новом дайджесте за неделю рассказ про сложные отношения с издателем, про еще более сложную Android-разработку, материалы про модульность, Hype-driven превращения, новинки Snapchat для раз...