PHP Дайджест № 203 (1 – 17 мая 2021)
Аксессоры свойств, пересечения типов и финальные константы официально предложены для 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, но можно установить расширение и узкие места станут быстрее.
- Ближайшие мероприятия:
Полный список митапов и конференций всегда доступен на 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:
Инструменты
- 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
Laravel
Yii
Статьи
Аудио/Видео
Сообщество
- У 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