- PVSM.RU - https://www.pvsm.ru -

PHP-Дайджест № 178 (6 – 21 апреля 2020)

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 1

Свежая подборка со ссылками на новости и материалы. В выпуске: Composer 2.0 Alpha и другие релизы, 5 новых и одно принятое RFC предложение из PHP Internals, а также обновленные атрибуты на голосовании, порция полезных инструментов, подкасты, интервью и многое другое.

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

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 2 Новости и релизы

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 5 PHP Internals

  • [RFC] throw expression [9] — Предложение принято и в PHP 8 throw будет не оператором, а выражением. Это значит, что возможно будет бросать исключение в коротких лямбдах, в тернарных операторах и других конструкциях:
    $callable = fn() => throw new Exception();
    
    $foo = $bar['key'] ?? throw new KeyNotSetOnBarException();
    
  • [RFC] Attributes v2 [10] — Предложение по атрибутам (аннотациям) было сильно доработано. В частности, добавлена поддержка нескольких атрибутов с одним именем, атрибуты для параметров функций, разделение на пользовательские атрибуты и атрибуты компилятора, возможность валидация атрибутов компилятора на этапе компиляции. А вот вложенные атрибуты в данной реализации не поддерживаются.

    Судя по ходу голосования [11], у него все шансы быть принятым. Также на голосование вынесен вопрос о синтаксисе: использовать <<>> или @:.

    Скрытый текст

    <<ExampleAttribute>>
    class Foo
    {
        <<ExampleAttribute>>
        public const FOO = 'foo';
    
        <<ExampleAttribute>>
        public $x;
    
        <<ExampleAttribute>>
        public function foo(<<ExampleAttribute>> $bar) { }
    }
    
    $object = new <<ExampleAttribute>> class () { };
    
    <<ExampleAttribute>>
    function f1() { }
    
    $f2 = <<ExampleAttribute>> function () { };
    
    $f3 = <<ExampleAttribute>> fn () => 1;
    
  • [RFC] PHP Namespace in core [12], [RFC] PHP Namespace Policy [13] — Сразу два почти идентичных RFC-документа, в которых предлагается использовать неймспейс PHP в качестве корневого для различных внутренних сущностей, например для планируемых аттрибутов.
  • [RFC] Mixed Type v2 [14] — Сейчас если у функции не указан возвращаемый тип, то непонятно то ли разработчик забыл указать, то ли сознательно не указал по какой-либо [15] причине. К тому же псевдотип mixed уже используется повсюду в документации.

    Предлагается добавить его в PHP 8. Тип mixed будет эквивалентен объединению типов array|bool|callable|int|float|null|object|resource|string.

  • [RFC] non-capturing catches [16] — Предлагается сделать возможным опускать объявление переменной в блоке catch:
    Скрытый текст

    try {
        changeImportantData();
    } catch (PermissionException) { // The intention is clear: exception details are irrelevant
        echo "You don't have permission to do this";
    }
    
  • [RFC] Match expression [17] — Вместо переделывания конструкции switch в выражение [18] предлагается ввести новое выражение match, которое лишено всех недостатков switch, таких как отсутствие проверки типа и возможности возвращать значение. Также в будущем оно может быть дополнено до полноценного паттерн-мэтчинга.
    Скрытый текст

    match ($condition) {
        1 => {
            foo();
            bar();
        },
        2 => baz(),
    }
    
    $expressionResult = match ($condition) {
        1, 2 => foo(),
        3, 4 => bar(),
        default => baz(),
    };
    
  • [RFC] Pipe Operator v2 [19] — Вторая попытка внести оператор |> для последовательного вызова функций c передачей результата предыдущей в качестве аргумента следующей. Семантика полностью копирует реализации в Elixir / JS и от первого варианта [20] (Hack) отличается отсутствием магии использования метки $$.
    $result = "Hello World"
        |> 'htmlentities'
        |> 'explode'
        |> fn($x) => array_map(fn($v) => 'strtoupper', $x)
        |> fn($x) => array_filter(fn($v) => $v != 'O');
    
  • Отклонено: [RFC] Compact Object Property Assignment [21]

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 6 Инструменты

  • jlaswell/compote [22] — Легковесный менеджер зависимостей для PHP написанный на Go. Не призван заменить Composer, а дополняет его для специфичных задач, например, для CI. Сейчас умеет только устанавливать залоченные зависимости.
  • repman.io [23] — Приватный репозиторий пакетов и прокси для Composer.
    Также предоставляет глобальный прокси [24] с CDN для packagist.org, что позволяет ускорить скачивание пакетов.
  • dantleech/what-changed [25] — Плагин для Composer, который сгенерирует отчет со списками изменений в пакетах, обновленных после запуска composer update.
  • maciejczyzewski/bottomline [26] — Аналог lodash / underscore для PHP. Мелкие полезные функции на каждый день для строк/массивов/объектов.
  • VKCOM/noverify v0.2.0 [27] — Статический анализатор для PHP на Go. В релизе улучшена поддержка PHP 7, больше анализаторов, меньше ложных срабатываний.
  • markrogoyski/math-php 1.0 [28] — Первый стабильный релиз математической библиотеки для PHP. Реализованы возможности для работы с матрицами/векторами, численный анализ, статистика и другое. Прислал @dmitrybalabka [29].

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 7 Symfony

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 10 Laravel

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 14 Laminas

Async PHP

  • hyperf/hyperf [49] — Фреймворк для создания сервисов на базе корутин Swoole. Прислал @dmitrybalabka [29].
  • clue/reactphp-flux [50] — Пакет позволяет ограничить количество одновременно выполняемых конкурентных задач в ReactPHP.

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 15 Материалы для обучения

PHP-Дайджест № 178 (6 – 21 апреля 2020) - 19 Аудио/Видео

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

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

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

Прислать ссылку [73]
Поиск ссылок по всем дайджестам [74]
Предыдущий выпуск: PHP-Дайджест № 177 [75]

Автор: Роман Пронский

Источник [76]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/352336

Ссылки в тексте:

[1] PHP 7.4.5: https://www.php.net/ChangeLog-7.php#7.4.5

[2] PHP 7.3.17: https://www.php.net/ChangeLog-7.php#7.3.17

[3] PHP 7.2.30: https://www.php.net/ChangeLog-7.php#7.2.30

[4] Composer v2.0 Alpha: https://freek.dev/1637-composer-2-whats-new-and-changed

[5] в канале: https://t.me/phpdigest/137

[6] PhpStorm 2020.1: https://habr.com/ru/post/497358/

[7] PHP онлайн-митап совместно с PHPofBY: https://meetups-online.ru/php-minsk-moskva

[8] Запись прошлого раза: https://www.youtube.com/watch?v=Bxe8FQyaCBs

[9] [RFC] throw expression: https://wiki.php.net/rfc/throw_expression

[10] [RFC] Attributes v2: https://wiki.php.net/rfc/attributes_v2

[11] голосования: https://wiki.php.net/rfc/attributes_v2#voting

[12] [RFC] PHP Namespace in core: https://wiki.php.net/rfc/php-namespace-in-core

[13] [RFC] PHP Namespace Policy: https://wiki.php.net/rfc/php_namespace_policy

[14] [RFC] Mixed Type v2: https://wiki.php.net/rfc/mixed_type_v2

[15] какой-либо: https://wiki.php.net/rfc/mixed_type_v2#:~:text=the%20type%20is%20not%20currently%20expressible

[16] [RFC] non-capturing catches: https://wiki.php.net/rfc/non-capturing_catches

[17] [RFC] Match expression: https://wiki.php.net/rfc/match_expression

[18] конструкции switch в выражение: https://wiki.php.net/rfc/switch_expression

[19] [RFC] Pipe Operator v2: https://wiki.php.net/rfc/pipe-operator-v2

[20] первого варианта: https://wiki.php.net/rfc/pipe-operator

[21] [RFC] Compact Object Property Assignment: https://wiki.php.net/rfc/compact-object-property-assignment

[22] jlaswell/compote: https://github.com/jlaswell/compote

[23] repman.io: https://repman.io/

[24] глобальный прокси: https://repman.io/proxy/

[25] dantleech/what-changed: https://github.com/dantleech/what-changed

[26] maciejczyzewski/bottomline: https://github.com/maciejczyzewski/bottomline

[27] VKCOM/noverify v0.2.0: https://github.com/VKCOM/noverify/releases/tag/v0.2.0

[28] markrogoyski/math-php 1.0: https://github.com/markrogoyski/math-php

[29] @dmitrybalabka: https://twitter.com/dmitrybalabka

[30] migrify/symfony-route-usage: https://github.com/migrify/symfony-route-usage

[31] Пост: https://www.tomasvotruba.com/blog/2020/04/06/how-to-find-dead-symfony-routes/

[32] Как перенести спагетти-код в 304 контроллера на Symfony 5: https://www.tomasvotruba.com/blog/2020/04/13/how-to-migrate-spaghetti-to-304-symfony-5-controllers-over-weekend/

[33] Как переиспользовать код с бандлами Symfony 5? Часть 1. Минимальный бандл: https://habr.com/ru/post/498134/

[34] Правильная регистрация консольных команд Symfony в DI: https://medium.com/phpyh/%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D1%85-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4-%D0%B2-symfony-di-f7536c254926

[35] Неделя Symfony #694 (13-19 апреля 2020): https://symfony.com/blog/a-week-of-symfony-694-13-19-april-2020

[36] Используем event sourcing в традиционном Laravel приложении: https://freek.dev/1634-mixing-event-sourcing-in-a-traditional-laravel-app

[37] Динамические связи в Laravel с использованием подзапросов: https://reinink.ca/articles/dynamic-relationships-in-laravel-using-subqueries

[38] Как лучше передавать аргументы в middleware на Laravel: https://timacdonald.me/rethinking-laravels-middleware-argument-api/

[39] О красоте контроллеров с единственным экшном.: https://driesvints.com/blog/the-beauty-of-single-action-controllers/

[40] Часть 1. Модель, Контроллер: https://habr.com/ru/post/497220/

[41] Часть 2. Шлюзы, Политики: https://habr.com/ru/post/497834/

[42] Mohamed Said: https://twitter.com/themsaid

[43] CSRF-защита: https://www.youtube.com/watch?v=AeakMsUnOCk

[44] CORS: https://www.youtube.com/watch?v=GPuiClqA-QE

[45] аутентификация: https://www.youtube.com/watch?v=a96ogPedoO4

[46] HTTP Middleware: https://www.youtube.com/watch?v=CoqALDABZbs

[47] The Laravel Podcast – The Ethos of Laravel, with Taylor Otwell: https://laravelpodcast.com/episodes/the-ethos-of-laravel

[48] April 2020 Technical Steering Committee Meeting: https://getlaminas.org/blog/2020-04-07-tsc-meeting.html

[49] hyperf/hyperf: https://github.com/hyperf/hyperf

[50] clue/reactphp-flux: https://github.com/clue/reactphp-flux

[51] Пишем игру «змейка» на PHP: https://thephp.website/en/issue/games-with-php/

[52] joseph-montanez/raylib-php: https://github.com/joseph-montanez/raylib-php

[53] О тестировании плагинов для Composer: https://blog.cebe.cc/posts/2020-04-17/testing-composer-plugins

[54] Улучшите архитектуру с помощью CQRS: https://thephp.cc/news/2020/04/improve-design-with-cqrs

[55] Web Application Architecture: https://matthiasnoback.nl/2020/04/early-release-of-web-application-architecture-book/

[56] PHP Mentors: http://www.phpmentors.com/

[57] Doctrine ResultSetMapping на примерах: https://habr.com/ru/post/496166/

[58] PHP Internals News #49: https://phpinternals.news/49

[59] PHP Internals News #48: https://phpinternals.news/48

[60] Sara Golemon: https://github.com/sgolemon

[61] Между Скобок № 4: https://soundcloud.com/between-braces/4-mikhail-mazein-highload-na-redis-i-php

[62] Между Скобок № 3: https://soundcloud.com/between-braces/3-dmitriy-simushev-kak-perestat-boyatsya-cqrs

[63] Moreview #3 | Александр Афенов: https://www.youtube.com/watch?v=9iNGdfu33VA

[64] Moreview #2 | Александр Макаров: https://www.youtube.com/watch?v=vDdrMaxeH1M

[65] расшифровка: https://habr.com/ru/post/497616/

[66] Советы по настройке внешнего вида и навигации в PhpStorm: https://blog.jetbrains.com/phpstorm/2020/04/new-video-series-phpstorm-tips-with-christoph-rumpel/

[67] @christophrumpel: https://twitter.com/christophrumpel

[68] Визуальное восприятие кода: https://www.youtube.com/watch?v=5qRFxMCEbLs

[69] личку: https://habrahabr.ru/conversations/pronskiy/

[70] почту: mailto:roman@pronskiy.com

[71] твиттер: https://twitter.com/pronskiy

[72] PHP Digest: https://t.me/phpdigest

[73] Прислать ссылку: https://bit.ly/php-digest-add-link

[74] Поиск ссылок по всем дайджестам: https://pronskiy.com/php-digest/

[75] Предыдущий выпуск: PHP-Дайджест № 177: https://habr.com/ru/post/495838/

[76] Источник: https://habr.com/ru/post/498246/?utm_source=habrahabr&utm_medium=rss&utm_campaign=498246