Фото: 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 PsrClock; 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 и другие улучшения. Как обычно, 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
станетOpenSSLCertificate
.Пока правда, это касается только новых символов, а миграция существующих в рамках этого RFC не затрагивается. Но в примерах приведены возможные трансформации:
str_contains()
->Stringcontains()
in_array()
->Arraycontains()
.
Звучит как идея для 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. Стрим с Freek Van der Herten, в котором он разрабатывает пакет c нуля.
- squirephp/squire — Статические Eloquent модели с полезными данными (список стран, аэропорты, и др.).
- Пошаговое руководство по созданию первого приложения для Laravel
- Laravel–Дайджест (22 февраля – 7 марта 2021)
Yii
- Новости 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+ пакетов.
- Когда объектов недостаточно — Интересные размышления на тему ООП.
- Run, config, run: как мы ускорили деплой конфигов в Badoo
- Бэкдор во взломанном 1С-Битрикс: под угрозой сотни сайтов
- Как мы быстро распилили монолит, когда командам стало тесно
Видео
- Большой стрим PHP-сообщества — Никита Попов, Александр Макаров, Валентин Удальцов и много других.
- Стрим Дмитрия Елисеева: О сложности домена и о провайдерах в PHP
- Антон Титов: Оркестрируй это! Описываем сложные бизнес процессы на PHP.
- PHP Release Radar #6: Bref 1.0 — C Matthieu Napoli.
Подкасты
- PHP Internals News #77 — Про добавленную в PHP 8.1 функцию fsync с автором David Gebler.
- PHP Internals News #78 — C Andreas Heigl о переносе документации PHP в Git. Кстати, если не видели, то у Андреаса был отличный доклад на PHP Russia.
- Пятиминутка PHP №87: PHP в 2021 году
- Пятиминутка PHP №86: План обновления на PHP 8
- Подкаст Между скобок 12: Антон Губарев – Работа архитектора
Сообщество
- PHP 8 и развитие языка в 30 вопросах и ответах
- 80+ докладов и статей, которые запомнились PHP-сообществу в 2020 году
После небольшого перерыва возвращаемся со стримом и ведущим Валентином Удальцовым!
Будет разбор новостей и ссылок из выпуска с подробностями и деталями, мнение Валентина по RFC и статьям. Интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 199
Автор: Роман Пронский