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

  • check [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

  • check [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 для мониторинга производительности. Подробнее в выпуске video 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

Статьи

Аудио/Видео

community Сообщество

  • У PHP бас-фактор равен двум — Joe Watkins пишет о том, что глубоко в ядре PHP разбираются только два человека, поэтому следует аккуратнее добавлять новые фичи.

    Тейлор из Laravel также отметил слабую ценность JIT и файберов для обычных пользователей:

  • 0xABADCAFE/php-demo-engine — Движок для создания демосценовых демок на PHP. Отрисовывается ASCII-символами в консоли.
  • Долгое время сайт remoteok.io был всего одним файлом index.php без фреймворков и при этом приносил $101k в месяц.

    Ушла эпоха и теперь это уже 5 файлов؜:

  • Немного магии PHP от Никиты Попова:
    $b = new class {     function __destruct() {         $GLOBALS['b'] = 2;     } };  $a = 1; $b = 1; var_dump($a + $b); // 3 

    3v4l.org/WMfPP

    Больше черной магии video показывал Александр Лисаченко на PHP Russia 2019. А на PHP Russia 2021 ждем от него еще PHP-чудес.


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

Подписывайтесь на Telegram-канал PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест № 202

ссылка на оригинал статьи https://habr.com/ru/post/557828/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *