Аксессоры свойств, пересечения типов и финальные константы официально предложены для PHP 8.1, и еще два RFC уже приняты. Также в выпуске порция инструментов, видео, подкасты, статьи, новости сообщества.
Приятного чтения!
Новости
- PHP 7.4.19, PHP 8.0.6 — Исправлен баг в PDO_pgsql.
- Статистика версий PHP – 2021.1 — Традиционная подборка статистики на основе данных, которые Composer отправляет при подключении к packagist.org.
- PHP 7.4: 45.92% (+3.31)
- PHP 7.3: 21.30% (-5.75)
- PHP 7.2: 12.89% (-2.39)
- PHP 8.0: 9.44% (+9.17)
- PHP 7.1: 5.21% (-2.24)
- Phalcon Roadmap — Фреймворк раньше поставлялся как расширение, но версия v5 будет последней в таком формате. Для последующих версий планируется переход на гибридный формат: чистый PHP + опциональное расширение. То есть будет работать на чистом PHP, но можно установить расширение и узкие места станут быстрее.
- Ближайшие мероприятия:
- 18 мая, 3-й митап PHP-чата Дагестана, 19.00 МСК — Трансляция. Как поживает PHP сообщество в Дагестане?
- 20 мая 2021, PHP of BY Meetup #36 онлайн, 19.00 МСК — Регистрация по ссылке.
- 28 июня, Москва, PHP Russia, 2021.
Полный список митапов и конференций всегда доступен на phpcommunity.ru.
PHP Internals
[RFC] Namespaces in bundled PHP extensions
Маленький шажок в сторону более чистого PHP! Новые символы (классы, интерфейсы и т.д.) в расширениях теперь должны будут использовать неймспейсы.
Вот пример. Типresource
в PHP де-факто объявлен устаревшим и все существующие ресурсы потихоньку переносятся в объекты. Так вот, в PHP 8.1 появятся вот такие классы в неймспейсах вместо ресурсов:
IMAPConnection -> IMAP\Connection FTPConnection -> FTP\Connection LDAP -> LDAP\Connection LDAPResult -> LDAP\Result LDAPResultEntry -> LDAP\ResultEntry PgSql -> PgSql\Connection PgSqlResult -> PgSql\Result PgSqlLob -> PgSql\Lob
[RFC] Add return type declarations for internal methods
Большая часть встроенных методов в PHP 8.0 получили декларации типов параметров и возвращаемых значений. Но в некоторых случаях добавить тип не получилось. Например, для возвращаемых значений публичных нефинальных методов.
А дело в том, что их можно переопределить в пользовательском коде. И тогда если в родительском классе добавить тип, то пользовательское переопределение станет невалидным и отвалится с ошибкой.
Вот пример для иллюстрации проблемыclass SomeStandardClass { public function method(): int {} } class UserClass extends SomeStandardClass { public function method() {} } // Fatal error: Declaration of UserClass::method() must be compatible with SomeStandardClass::method()
Теперь для таких случаев будет постепенная миграция. В PHP 8.1 все внутренние методы тоже получат недостающие типы. А если в пользовательском коде они переопределены, то будет брошенDeprecation notice
. А уже в PHP 9 будетFatal error
.
class MyDateTime extends DateTime { public function modify(string $modifier) { return false; } } // Deprecated: Declaration of MyDateTime::modify(string $modifier) should be compatible with DateTime::modify(string $modifier): DateTime|false
[RFC] Property Accessors
Никита добил реализацию аксессоров свойств и теперь предложение уже официально на стадии обсуждения.
Суть следующая. Сейчас геттеры и сеттеры использовать не удобно, магические методы__get
и__set
еще хуже. Предлагаются аксессоры как вC#
:
class Foo { public $prop { get { /* ... */ } set { /* ... */ } } }
С их помощью можно реализовать readonly свойства:
class User { public string $name { get; } public function __construct(string $name) { $this->name = $name; } }
Указывать асимметричный доступ, то есть public/private раздельно на чтение и запись:
class User { public string $name { get; private set; } ... }
Или использовать как полноценные методы для валидации или других действий:
class Foo { public int $bar { get { error_log('Getting $bar'); return $this->bar; } set { assert($bar > 42); $this->bar = $bar; } } }
Части сlazy
иguard
были убраны из предложения для PHP 8.1.
[RFC] Pure intersection types
В PHP 8.0 были добавлены объединенные типы, а в данном RFC предлагается добавить пересечения типов.
Синтаксис вот такойTypeA&TypeB
и означает, что переменная должна одновременно бытьinstanceof TypeA
иinstanceof TypeB
.
Скрытый текстclass A { private Traversable&Countable $countableIterator; public function setIterator(Traversable&Countable $countableIterator): void { $this->countableIterator = $countableIterator; } public function getIterator(): Traversable&Countable { return $this->countableIterator; } }
Предложение называется pure intersection types, потому что комбинации с union типами не поддерживаются и оставлены на рассмотрение в будущем. Алиасы для сложных типов тоже оставлены на будущее.
[RFC] Deprecate ticks
Есть в PHP механизм тиков:declare(ticks=1);
. Изначально он нужен был для отслеживания сигналов pcntl. Сейчас же для этого можно использоватьpcntl_signal()
иpcntl_async_signals()
. Поэтому предлагается тики задепрекейтить в PHP 8.1 и убрать полностью в PHP 9.
[RFC] Final class constants
Предлагаетсяfinal
для констант, чтоб нельзя было их переопределить в дочерних классах.
Скрытый текстclass Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; } // Fatal error: Bar::X cannot override final constant Foo::X
Забавный факт из RFC: в интерфейсах константы уже сейчас финальные.
- И еще пара ссылок для тех кто хотел бы начать контрибьютить в PHP:
- Как настроить CLion с php-src — Инструкция от релиз-менеджера PHP 8.1.
- Как скомпилировать PHP из исходников на Debian/Ubuntu — Руководство для новичков на PHP.Watch.
Инструменты
- phpbench/phpbench 1.0.0 — Удобный инструмент для бенчмаркания своего кода. В новой версии много, включая поддержку бейслайн — фиксирования состояния, и возможность запуска на CI для мониторинга производительности. Подробнее в выпуске Release Radar #10 с автором пакета.
- ergebnis/factory-bot — Фабрика фикстур для Doctrine ORM.
- spatie/file-system-watcher — Небольшая обертка над шикарной js-либой paulmillr/chokidar для отслеживания изменений файловой системы.
- vtsykun/packeton — Приватный packagist или свой репозиторий для composer-пакетов, когда composer/satis уже мало, а платный packagist.com пока еще не нужен.
- rybakit/phpunit-extras — Кастомные аннотации и методы expect*() для PHPUnit, чтобы сделать тесты чище.
- infection 0.23.0 — Обновление инструмента мутационного тестирования, теперь с поддержкой pestphp/pest.
- captainhookphp/captainhook — Git-хуки для PHP проектов. Например, можно легко настроить проверку стилей или запуск тестов перед пушем в репозиторий.
- readme.so — Классный генератор README-файлов. (Не PHP).
Symfony
- Что нового будет в Symfony 5.3
- Отправление сообщений пачками в Symfony Messenger с использованием pcntl_alarm().
- PrestoPHP/PrestoPHP — Микрофреймворк Silex давно официально не поддерживается, но есть вот такой форк.
- TransMaintain — инструмент для поддержания файлов переводов интерфейса Symfony проектов в консистентном состоянии.
- Неделя Symfony #750 (10-16 мая 2021)
Laravel
- laravel-arcanist/arcanist — Пакет для создания многошаговых форм. Подробный видеообзор от автора.
- Wulfheart/pretty-routes — В красивом виде выводит список всех роутов в консоль.
- cerbero90/lazy-json — Подгружает большие JSON-документы в ленивые коллекции из illuminate/support (Laravel).
- mailcare/mailcare — Сервис одноразовых имейлов типа mailinator.com, реализованный на Laravel.
- Декомпозиция Form Request в Laravel
Yii
- Новости Yii 2021, выпуск 2 — Новости по Yii 3 и набор релизов Yii 2, а также интересные проекты, не связанные напрямую с кодом.
- Релизы пакетов для Yii 3: yiisoft/profiler, yiisoft/error-handler, yiisoft/translator, yiisoft/yii-event, yiisoft/assets.
Статьи
- Об использовании ексепшенов и ретраев при работе с сетью. От автора thephpleague/flysystem.
- Алгоритмическая сложность встроенных функций PHP.
- Функциональное мышление в PHP — Перевод книги от Larry Garfield, который подготовил Алексей Пыльцын lex111.
- Анализ лицензий, используемых в PHP пакетах — У многих популярных пакетов лицензия не указана или указана неправильно.
- Мир изменился — CQRS и ES встречаются в PHP чаще, чем кажется — Интервью с Антоном Шабовтой.
- Расширенные возможности MessagePack.
- PHP-SPX простой профайлер трейсер для PHP.
Аудио/Видео
- Видиозапись с таймкодами PHP-митапа в Казани.
- Видеозаписи всех докладов с PHPFest 2020.
- Профилирование с помощью Xdebug 3 в Docker
- Дебажим тесты с помощью PhpStorm и Xdebug 3 на Linux
- PHP Internals News podcast #84 — Представляем релиз-менеджеров PHP 8.1: Ben Ramsey, Patrick Allaert.
Сообщество
- У PHP бас-фактор равен двум — Joe Watkins пишет о том, что глубоко в ядре PHP разбираются только два человека, поэтому следует аккуратнее добавлять новые фичи.
Тейлор из Laravel также отметил слабую ценность JIT и файберов для обычных пользователей:
- 0xABADCAFE/php-demo-engine — Движок для создания демосценовых демок на PHP. Отрисовывается ASCII-символами в консоли.
- Долгое время сайт remoteok.io был всего одним файлом index.php без фреймворков и при этом приносил $101k в месяц.
Ушла эпоха и теперь это уже 5 файлов?:
- Немного магии PHP от Никиты Попова:
3v4l.org/WMfPP$b = new class { function __destruct() { $GLOBALS['b'] = 2; } }; $a = 1; $b = 1; var_dump($a + $b); // 3
Больше черной магии показывал Александр Лисаченко на PHP Russia 2019. А на PHP Russia 2021 ждем от него еще PHP-чудес.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Подписывайтесь на Telegram-канал PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP-Дайджест № 202
VokaMut
Магия от Никиты вне Хогвартса
Insa88
Отчего же? Типичные штучки от Слизерин.
Sway
Эта магия настолько черна что даже "неназываемый" ею брезгует =)))
zorn-v1
И в чем тут магия? Деструктор вызывается когда анонимный класс высвобождается.
Аналогично
Понятно, что так делать нельзя и слово
$GLOBALS
должно тригерить сирену где только можно...VokaMut
Да, вы правы, магии в программировании не существует, любое поведение можно объяснить.
zorn-v1
Существует, пока ты не понимаешь как это происходит :)
Да и для любого не программиста "это все магия"
Но когда понимаешь, становится "нафиг такой говнокод", а не восторженное "ух ты"
Ну и я за поменьше "магии" в коде приложения (библиотеки пусть магиканят, но в меру).
Возьмем ларавел… вот нафига там столько магии? )
Tatikoma
Да, фокус именно в моменте вызова деструктора, а не в глобалс. Триггерить сирену на глобалс не поможет от этой ситуации, кажется здесь должна быть более комплексная проверка на деструкторы.
zorn-v1
Ну я образно говоря про глобалс.
На передачу аргумента по ссылке тоже должна быть отдельная сирена… И котел в аду ))
Tatikoma
PSR-12 не запрещает использовать ссылки. Да и нужны они в самом деле.