PHP Дайджест № 200 (22 февраля – 15 марта 2021)
Свежая подборка со ссылками на новости и материалы. В выпуске: Объекты в инициализаторах, неймспейсы для расширений, и другие 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
Статьи
Видео
Подкасты
Сообщество
После небольшого перерыва возвращаемся со стримом и ведущим Валентином Удальцовым!
Будет разбор новостей и ссылок из выпуска с подробностями и деталями, мнение Валентина по RFC и статьям. Интересное, но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 199