PHP-Дайджест № 182 (1 – 22 июня 2020)

dd53c33b2a501f4727f6929a1e3a2318.jpg

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

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


f574e9991c42407b8fa789a66b854f8d.png Новости и релизы


  • ruPHP исполнилось 25 лет — Таймлайн с основными событиями в истории языка.
  • PHP 7.4.7 — Кроме прочего, в этом обновлении исправлена ошибка yield from.
  • PHP 7.3.19
  • Composer 2.0.0-alpha1
  • The State of Developer Ecosystem in 2020 — PHP-секция из опроса разработчиков от JetBrains.

    65% опрошенных указали, что для отладки пользуются подходом dump & die, поэтому провокационный твит автора Xdebug ожидаемо вызвал бурную реакцию в сообществе:

    PHP developers that don’t use Xdebug for debugging are amateurs.

    — Derick Rethans (@derickr) June 20, 2020


c9ee7880391644e4aef6cc28ca681ab0.png PHP Internals


  • check[RFC] Attribute Amendments — Приняты дополнения к атрибутам: возможность группировать <>, 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, но синтаксис многим не по душе. На голосование выставлено три варианта: <> (текущий) 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.


cf862d9072784d04b621238ec137f2ca.png Инструменты


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


96b65e92179a40f2bd1884549973ddd5.png Symfony


  • Доступна сертификация по Symfony 5.
  • В Symfony 6 для конфигов будут использоваться PHP-файлы вместо YAML или XML.
  • dbu/snake-bundle — Игра змейка, реализованная на symfony/console.
  • Какой прирост производительности ожидать от приложения на Symfony 5 с предзагрузкой опкеша?
  • 10 советов по тестированию Symfony.
  • Защита Symfony-приложений от Top 10 OWASP уязвимостей.
  • Неделя Symfony #703 (15–21 июня 2020)


314bd0f0dfc54e3fa7f0c0daef1a2d25.png Laravel


  • spatie/laravel-cronless-schedule — Пакет для выполнения задач по расписанию без использования cron. Под капотом ReactPHP и таймеры. Интро.
  • Добавляем try/catch в коллекции Laravel
  • habrLaravel-Дайджест (15–21 июня 2020)
  • Статистика пакетов экосистемы Laravel
  • Большой тред с советами по написанию Laravel-приложений:

    In this thread I’ll list tactics you can use to write cleaner code in Laravel.

    As you use them repeatedly, you’ll develop a sense for what’s good code and what’s bad code.

    I’ll also sprinkle some general Laravel code advice in between these tactics.

    THREAD

    — Samuel Štancl (@samuelstancl) June 16, 2020


569de4298b764a33894aa517e74324f9.png Yii


  • Интеграция Yii 2 и Doctrine ORM


pjlkob5btqut7it5e_eod-qtqh0.png Laminas


  • videoМертв ли Zend Framework? — На этот и другие вопросы отвечает лидер проекта Laminas — Matthew Weier O’Phinney.
  • asgrim/mini-mezzio — Быстрое создание приложения на Mezzio (экс Zend Expressive).


732rpqll-yvu0hrtaw6yeism-de.png Async PHP


  • badfarm/zanzara — Асинхронный фреймворк для создания Telegram-ботов на базе ReactPHP.
  • simple-swoole/simps — Еще один фреймворк на базе Swoole. Судя по бенчмаркам самый быстрый из PHP.
  • videoВидеокурс по ReactPHP от Marcel Pociot


329bec7c1e914963a1c5d2f2bfe99995.png Материалы для обучения


  • Представляем новый серверлесс LAMP стек — Пост в блоге AWS об использовании PHP и подборка ресурсов по теме.
    Также для PhpStorm теперь доступен официальный плагин AWS Toolkit от Amazon.
  • Об объявлении свойств в конструкторе в PHP 8.
  • Какие функции PHP наиболее часто используются во фреймворках? — В Symfony это sprintf(), в Laravel — is_null(). Автор предоставил инструкцию, как подсчитать для других фреймворков.
  • О финальных классах в PHP.
  • habrМиллион за месяц: как запустить стартап в Европе своими силами.
  • habrRedis на практических примерах.
  • habrБеги, PHPUnit, беги: как я оптимизировал время выполнения тестов.
  • habrСамый быстрый шаблонизатор для PHP.


8dcc236774104f8286a40ceaea553820.png Аудио/Видео


  • videoВидеозаписи всех докладов с PHP Russia 2020 Online
  • videoruМакс Рафалко, Принципы проектирования пакетов PHP
  • videoru Стрим Пятиминутка PHP по Laravel Livewire: сетевая игра (часть 5)
  • audioruМежду скобок № 9: Александр Лисаченко — АОП в PHP.
  • audioPHP Internals News #58 — C Max Semenik о принятом RFC non-capturing catches.
  • audioPHP Internals News #57 — C Ralph Schindler о его предложении добавить return if ($condition): $returnValue;.
  • audioPHP Internals News #56 — С Dan Ackroyd о добавленном псевдотипе mixed.

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

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

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

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

© Habrahabr.ru