Свежая подборка со ссылками на новости и материалы. В выпуске: 3 принятых и 6 новых RFC-предложений из PHP Internals, включая голосование за новый синтаксис для атрибутов — @@ и почему #[] был бы лучше, переименования black/whitelist в PHP-мире, как отлаживают PHP-разработчики, аналог ngrok на PHP, видео, подкасты и многое другое.

Приятного чтения!



Новости и релизы



PHP Internals


  • check [RFC] Attribute Amendments — Приняты дополнения к атрибутам: возможность группировать <<Attr1, Attr2>>, PhpAttribute переименован в Attribute, валидация и возможность добавлять несколько одинаковых атрибутов.
  • check [RFC] Ensure correct signatures of magic methods — Сигнатуры магических методов в PHP 8 будут валидироваться. Например, сейчас можно объявить в классе вот такой магический метод:
    Скрытый текст
    class Foo
    {
        function __get(int $name): void
        {
            echo $name;
        }
    }
    (new Foo)->{42};
    
    В PHP 8 это вызовет ошибку на этапе компиляции.
  • check [RFC] Make sorting stable — Все стандартные функции сортировки в PHP (sort, usort, asort и т.д.) начиная с PHP 8.0 будут стабильными. Это значит, что гарантируется оригинальный порядок элементов с одинаковыми значениями. В текущих версиях легко найти примеры, когда это не так.
  • cross [RFC] Opcache optimization without any caching — Отклонено предложение по выполнению оптимизаций без кеширования опкодов.
  • [RFC] Make constructors and destructors return void — Сейчас в PHP можно возвращать любые значения из конструкторов и деструкторов, например:
    Скрытый текст
    class Test {
            public function __construct() {
                    return 0;
            }
    
            public function __destruct() {
                    return 1;
            }
    }
    
    $test = new Test();
    
    // this prints 0
    echo $test->__construct();
    // this prints 1
    echo $test->__destruct();
    
    Предлагается в PHP 8.0 бросать Deprecated предупреждение в таких случаях. А уже в PHP 9.0 запретить полностью и генерировать Fatal Error.
  • [RFC] Treat namespaced names as single token — Из-за того, что каждый элемент неймспейса рассматривается интерпретатором как отдельный токен, внутри неймспейса не может быть ключевого слова. Например, namespace app\function { class Foo {} }; свалится с ошибкой Parse error. Предлагается считать токеном весь неймспейс — это позволит минимизировать проблемы обратной совместимости при введении новых ключевых слов.
  • [RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON — Токен :: в PHP называется T_PAAMAYIM_NEKUDOTAYIM — этот факт даже был обозначен как проблема № 1 в списке грустей PHP.
    Автор предлагает переименовать токен. Смысла в этом нет, потому что в сообщениях об ошибке итак выводится ::, а с таким названием он и гуглится идеально.
  • [RFC] Shorter Attribute Syntax — Аттрибуты уже были приняты для PHP 8, но синтаксис многим не по душе. На голосование выставлено три варианта: <<Attr>> (текущий) vs @@Attr vs #[Attr]. Brent Roоse привел несколько убедительных аргументов в пользу #[ ]:
    • Такой же синтаксис в Rust.
    • Он обратно совместим: #[Attribute] просто проигнорируется интерпретатором PHP <=7.4 как комментарий.
    • @@ можно спутать с оператором подавления ошибок (пример).
    • <<>> тоже не очень, потому что можно спутать с битовыми операторами и в будущем с дженериками, которые вероятно будут использовать одинарные угловые скобки <>.

  • [RFC] Change terminology to ExcludeList — Тема переименования потенциально неполиткорректных терминов не обошла стороной и PHP-мир. В Internals были горячие обсуждения.
    В ядре PHP изменение только в одном месте: директиву конфигурации опкеша opcache.blacklist_filename предлагается заменить на opcache.exclude_list_filename.
    В других PHP-инструментах соответствующие изменения уже внесли: PHPUnit, Drupal, Xdebug, Yii, Composer (+ работа с не-master Git-ветками). Также есть обсуждение правил для PHP_CodeSniffer для поиска «плохих» слов.
  • [RFC] Nullsafe operator — Вместо пачки вложенных условий предлагается добавить возможность обращения к свойству или методу с проверкой на null:
    $country = $session?->user?->getAddress()?->country;

    Вместо
    $country =  null;
    
    if ($session !== null) {
        $user = $session->user;
    
        if ($user !== null) {
            $address = $user->getAddress();
    
            if ($address !== null) {
                $country = $address->country;
            }
        }
    }
    
  • Обновлено расписание PHP 8.0 — Заморозка новых фич сдвинута на 4 августа, а финальный релиз назначен на 26 ноября.
  • Пощупать PHP 8 можно на известном ресурсе 3v4l.org. Для этого достаточно посмотреть результат запуска в ветке php-master.

Инструменты


  • beyondcode/expose — Сервис туннелирования на чистом PHP. Аналог ngrok. Подробнее было в канале PHP Digest.
  • canvural/php-openapi-faker — Библиотека для генерации тестовых данных для OpenAPI запросов/ответов/схем.
  • doctrine/migrations 3.0.0 — Мажорное обновление инструмента для миграций.
  • mathiasverraes/uptodocs — Маленький инструмент, который находит блоки PHP-кода в Markdown-файлах и запускает их для поиска падающих.

Symfony



Laravel



Yii



Laminas



Async PHP



Материалы для обучения



Аудио/Видео



Спасибо за внимание!

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

Больше новостей и комментариев в Telegram-канале PHP Digest.

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