Аксессоры свойств, пересечения типов и финальные константы официально предложены для 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