PHP Дайджест № 203 (1 – 17 мая 2021)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!


Аксессоры свойств, пересечения типов и финальные константы официально предложены для 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 МСК — Трансляция. habr Как поживает PHP сообщество в Дагестане?
    • 20 мая 2021, PHP of BY Meetup #36 онлайн, 19.00 МСК — Регистрация по ссылке.
    • 28 июня, Москва, PHP Russia, 2021.

    Полный список митапов и конференций всегда доступен на 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:
    • Как настроить CLion с php-src — Инструкция от релиз-менеджера PHP 8.1.
    • Как скомпилировать PHP из исходников на Debian/Ubuntu — Руководство для новичков на PHP.Watch.


Инструменты


  • 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


  • Что нового будет в Symfony 5.3
  • Отправление сообщений пачками в Symfony Messenger с использованием pcntl_alarm().
  • PrestoPHP/PrestoPHP — Микрофреймворк Silex давно официально не поддерживается, но есть вот такой форк.
  • TransMaintain — инструмент для поддержания файлов переводов интерфейса Symfony проектов в консистентном состоянии.
  • Неделя Symfony #750 (10-16 мая 2021)


Laravel


  • laravel-arcanist/arcanist — Пакет для создания многошаговых форм. video Подробный видеообзор от автора.
  • Wulfheart/pretty-routes — В красивом виде выводит список всех роутов в консоль.
  • cerbero90/lazy-json — Подгружает большие JSON-документы в ленивые коллекции из illuminate/support (Laravel).
  • mailcare/mailcare — Сервис одноразовых имейлов типа mailinator.com, реализованный на Laravel.
  • habr Декомпозиция 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 пакетах — У многих популярных пакетов лицензия не указана или указана неправильно.
  • habr Мир изменился — CQRS и ES встречаются в PHP чаще, чем кажется — Интервью с Антоном Шабовтой.
  • habr Расширенные возможности MessagePack.
  • habr PHP-SPX простой профайлер трейсер для PHP.


Аудио/Видео


  • video Видиозапись с таймкодами PHP-митапа в Казани.
  • video Видеозаписи всех докладов с PHPFest 2020.
  • video Профилирование с помощью Xdebug 3 в Docker
  • video Дебажим тесты с помощью PhpStorm и Xdebug 3 на Linux
  • audio PHP Internals News podcast #84 — Представляем релиз-менеджеров PHP 8.1: Ben Ramsey, Patrick Allaert.


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/


Интересные статьи

Интересные статьи

Всем привет! Продолжаем дайджесты новостей и других материалов о свободном и открытом ПО и немного о железе. Всё самое главное про пингвинов и не только, в России и мире. ИСП РАН займё...
Дайджест собирает свежие статьи по дизайну интерфейсов, а также инструменты, паттерны, кейсы, тренды и исторические рассказы с 2009 года. Я тщательно фильтрую большой поток подписок, ...
Рон Пресслер собрал и выложил новый «официальный» прототип Project Loom (файберы для Java). В качестве основы используется JDK 14. Скачать можно здесь, прочитать анонc можно здесь. Люди потих...
Новый дайджест и в нем чтение текста на вывесках, лучшие практики и инструменты разработки, магия автоматической сборки, приложения для цифрового детокса, иллюзии дизайна и Flutter. ...
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.