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

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

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

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

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

PHP-Дайджест № 182 (1 – 22 июня 2020) - 2 Новости и релизы

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

  • check [RFC] Attribute Amendments [9] — Приняты дополнения к атрибутам: возможность группировать <<Attr1, Attr2>>, PhpAttribute переименован в Attribute, валидация и возможность добавлять несколько одинаковых атрибутов.
  • check [RFC] Ensure correct signatures of magic methods [10] — Сигнатуры магических методов в PHP 8 будут валидироваться. Например, сейчас можно объявить в классе вот такой магический метод:
    Скрытый текст

    class Foo
    {
        function __get(int $name): void
        {
            echo $name;
        }
    }
    (new Foo)->{42};
    

    В PHP 8 это вызовет ошибку на этапе компиляции.

  • check [RFC] Make sorting stable [11] — Все стандартные функции сортировки в PHP (sort, usort, asort и т.д.) начиная с PHP 8.0 будут стабильными. Это значит, что гарантируется оригинальный порядок элементов с одинаковыми значениями. В текущих версиях легко найти примеры, когда это не так [12].
  • cross [RFC] Opcache optimization without any caching [13] — Отклонено предложение по выполнению оптимизаций без кеширования опкодов.
  • [RFC] Make constructors and destructors return void [14] — Сейчас в 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 [15] — Из-за того, что каждый элемент неймспейса рассматривается интерпретатором как отдельный токен, внутри неймспейса не может быть ключевого слова. Например, namespace appfunction { class Foo {} }; свалится с ошибкой Parse error. Предлагается считать токеном весь неймспейс — это позволит минимизировать проблемы обратной совместимости при введении новых ключевых слов.
  • [RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON [16] — Токен :: в PHP называется T_PAAMAYIM_NEKUDOTAYIM — этот факт даже был обозначен как проблема № 1 [17] в списке грустей PHP [18].
    Автор предлагает переименовать токен. Смысла в этом нет, потому что в сообщениях об ошибке итак выводится ::, а с таким названием он и гуглится идеально.
  • [RFC] Shorter Attribute Syntax [19] — Аттрибуты уже были приняты для PHP 8, но синтаксис многим не по душе. На голосование выставлено три варианта: <<Attr>> (текущий) vs @@Attr vs #[Attr]. Brent Roоse привел [20] несколько убедительных аргументов в пользу #[ ]:
    • Такой же синтаксис в Rust.
    • Он обратно совместим: #[Attribute] просто проигнорируется интерпретатором PHP <=7.4 как комментарий.
    • @@ можно спутать с оператором подавления ошибок (пример [21]).
    • <<>> тоже не очень, потому что можно спутать с битовыми операторами и в будущем с дженериками, которые вероятно будут использовать одинарные угловые скобки <>.

  • [RFC] Change terminology to ExcludeList [22] — Тема переименования потенциально неполиткорректных терминов не обошла стороной и PHP-мир. В Internals были горячие обсуждения [23].
    В ядре PHP изменение только в одном месте: директиву конфигурации опкеша opcache.blacklist_filename предлагается заменить на opcache.exclude_list_filename.
    В других PHP-инструментах соответствующие изменения уже внесли: PHPUnit [24], Drupal [25], Xdebug [26], Yii [27], Composer [28] (+ работа с не-master Git-ветками [29]). Также сделали правила для PHP_CodeSniffer [30] для поиска «плохих» слов.
  • [RFC] Nullsafe operator [31] — Вместо пачки вложенных условий предлагается добавить возможность обращения к свойству или методу с проверкой на 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 [32] — Заморозка новых фич сдвинута на 4 августа, а финальный релиз назначен на 26 ноября.
  • Пощупать PHP 8 можно на известном ресурсе 3v4l.org [33]. Для этого достаточно посмотреть результат запуска в ветке php-master [34].

PHP-Дайджест № 182 (1 – 22 июня 2020) - 9 Инструменты

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

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

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

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

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

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

PHP-Дайджест № 182 (1 – 22 июня 2020) - 18 Материалы для обучения

PHP-Дайджест № 182 (1 – 22 июня 2020) - 23 Аудио/Видео

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

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

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

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

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

Источник [93]


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

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

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

[1] PHP исполнилось 25 лет: https://www.jetbrains.com/ru-ru/lp/php-25/

[2] PHP 7.4.7: https://www.php.net/releases/7_4_7.php

[3] ошибка yield from: https://twitter.com/nikita_ppv/status/1264857231167807489

[4] PHP 7.3.19: https://www.php.net/releases/7_3_19.php

[5] Composer 2.0.0-alpha1: https://github.com/composer/composer/releases/tag/2.0.0-alpha1

[6] The State of Developer Ecosystem in 2020: https://www.jetbrains.com/lp/devecosystem-2020/php/

[7] указали: https://www.jetbrains.com/lp/devecosystem-2020/php/#:~:text=How%20do%20you%20usually%20debug%20PHP%20code%3F

[8] June 20, 2020: https://twitter.com/derickr/status/1274134192155131905?ref_src=twsrc%5Etfw

[9] [RFC] Attribute Amendments: https://wiki.php.net/rfc/attribute_amendments

[10] [RFC] Ensure correct signatures of magic methods: https://wiki.php.net/rfc/magic-methods-signature

[11] [RFC] Make sorting stable: https://wiki.php.net/rfc/stable_sorting

[12] примеры, когда это не так: https://3v4l.org/bpvq1

[13] [RFC] Opcache optimization without any caching: https://wiki.php.net/rfc/opcache.no_cache

[14] [RFC] Make constructors and destructors return void: https://wiki.php.net/rfc/make_ctor_ret_void

[15] [RFC] Treat namespaced names as single token: https://wiki.php.net/rfc/namespaced_names_as_token

[16] [RFC] Rename T_PAAMAYIM_NEKUDOTAYIM to T_DOUBLE_COLON: https://wiki.php.net/rfc/rename-double-colon-token

[17] № 1: http://phpsadness.com/sad/1

[18] списке грустей PHP: http://phpsadness.com/

[19] [RFC] Shorter Attribute Syntax: https://wiki.php.net/rfc/shorter_attribute_syntax

[20] привел: https://twitter.com/brendt_gd/status/1273860590730129408

[21] пример: https://3v4l.org/j9tU0

[22] [RFC] Change terminology to ExcludeList: https://wiki.php.net/rfc/change-terminology-to-excludelist

[23] горячие обсуждения: https://externals.io/message/110515

[24] PHPUnit: https://github.com/sebastianbergmann/phpunit/blob/master/ChangeLog-9.3.md#930---2020-08-07

[25] Drupal: https://www.drupal.org/project/drupal/issues/2993575

[26] Xdebug: https://github.com/xdebug/xdebug/commit/63b43b51e43b794cf8cd740e54089b2b7320fbe1

[27] Yii: https://github.com/yiisoft/yii2/pull/18104

[28] Composer: https://github.com/composer/composer/pull/8957

[29] работа с не-master Git-ветками: https://blog.packagist.com/composer-and-default-git-branches/

[30] правила для PHP_CodeSniffer: https://github.com/PHPCSStandards/PHPCSExtra/issues/59

[31] [RFC] Nullsafe operator: https://wiki.php.net/rfc/nullsafe_operator

[32] Обновлено расписание PHP 8.0: https://wiki.php.net/todo/php80

[33] 3v4l.org: https://3v4l.org/

[34] результат запуска в ветке php-master: https://3v4l.org/MgCFs/rfc#output

[35] beyondcode/expose: https://github.com/beyondcode/expose

[36] в канале PHP Digest: https://t.me/phpdigest/156

[37] canvural/php-openapi-faker: https://github.com/canvural/php-openapi-faker

[38] doctrine/migrations 3.0.0: https://github.com/doctrine/migrations/releases/tag/3.0.0

[39] mathiasverraes/uptodocs: https://github.com/mathiasverraes/uptodocs

[40] сертификация по Symfony 5: https://symfony.com/blog/the-symfony-5-certification-is-now-available

[41] будут использоваться PHP-файлы: https://github.com/symfony/symfony/issues/37186

[42] dbu/snake-bundle: https://github.com/dbu/snake-bundle

[43] Какой прирост производительности: https://www.ibexa.co/blog/how-much-of-a-performance-boost-can-you-expect-for-a-symfony-5-app-with-php-opcache-preloading

[44] 10 советов по тестированию Symfony: https://blog.cemunalan.com.tr/2020/02/02/10-symfony-testing-tips/

[45] Защита Symfony-приложений от Top 10 OWASP уязвимостей: https://nicwortel.nl/blog/2020/06/07/protect-symfony-application-against-owasp-top-10-security-risks

[46] Неделя Symfony #703 (15-21 июня 2020): https://symfony.com/blog/a-week-of-symfony-703-15-21-june-2020

[47] spatie/laravel-cronless-schedule: https://github.com/spatie/laravel-cronless-schedule

[48] Интро: https://freek.dev/1689-a-package-to-run-the-laravel-scheduler-without-relying-on-cron

[49] Добавляем try/catch в коллекции Laravel: https://freek.dev/1691-adding-trycatch-to-laravel-collections

[50] Laravel-Дайджест (15–21 июня 2020): https://habr.com/ru/post/507610/

[51] Статистика пакетов экосистемы Laravel: https://itnext.io/laravel-package-ecosystem-4afd53fad192

[52] June 16, 2020: https://twitter.com/samuelstancl/status/1272822437181378561?ref_src=twsrc%5Etfw

[53] Интеграция Yii 2 и Doctrine ORM: https://medium.com/rigor-guild/yii2-doctrine-orm-simple-integration-fb0625002a40

[54] Мертв ли Zend Framework?: https://www.youtube.com/watch?v=5luPg2oVUIk

[55] другие вопросы: https://www.youtube.com/watch?v=Gux2i9_A22c&list=PLCYlUTOY-57U3BlvsxEWzdmh_f7HHSAZu

[56] Matthew Weier O'Phinney: https://twitter.com/mwop

[57] asgrim/mini-mezzio: https://github.com/asgrim/mini-mezzio

[58] Mezzio: https://github.com/mezzio/mezzio

[59] badfarm/zanzara: https://github.com/badfarm/zanzara

[60] simple-swoole/simps: https://github.com/simple-swoole/simps

[61] бенчмаркам: https://github.com/the-benchmarker/web-frameworks#results

[62] Видеокурс по ReactPHP от Marcel Pociot: https://beyondco.de/video-courses#:~:text=Learning%20ReactPHP

[63] Представляем новый серверлесс LAMP стек: https://aws.amazon.com/blogs/compute/introducing-the-new-serverless-lamp-stack/

[64] подборка ресурсов: https://github.com/aws-samples/php-examples-for-aws-lambda/blob/master/serverless-php-resources.md

[65] AWS Toolkit: https://plugins.jetbrains.com/plugin/11349-aws-toolkit

[66] Об объявлении свойств в конструкторе в PHP 8: https://stitcher.io/blog/constructor-promotion-in-php-8

[67] Какие функции PHP наиболее часто используются во фреймворках?: https://thephp.website/en/issue/most-used-php-functions/

[68] инструкцию: https://github.com/nawarian/The-PHP-Website/tree/master/code/15-framework-functions/

[69] О финальных классах в PHP: https://medium.com/swlh/final-classes-in-php-9174e3e2747e

[70] Миллион за месяц: https://habr.com/ru/post/506346/

[71] Redis на практических примерах: https://habr.com/ru/company/manychat/blog/507136/

[72] Беги, PHPUnit, беги: https://habr.com/ru/post/505736/

[73] Самый быстрый шаблонизатор для PHP: https://habr.com/ru/post/504720/

[74] Видеозаписи всех докладов с PHP Russia 2020 Online: https://habr.com/ru/company/badoo/blog/487264/

[75] Макс Рафалко, Принципы проектирования пакетов PHP: https://www.youtube.com/watch?v=K_H1EweYmFU

[76] сетевая игра (часть 5): https://www.youtube.com/watch?v=SoOcZDRCmFI

[77] Между скобок № 9: https://soundcloud.com/between-braces/9-aleksandr-lisachenko-aop-v-php

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

[79] Max Semenik: https://github.com/MaxSem

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

[81] PHP Internals News #57: https://phpinternals.news/57

[82] Ralph Schindler: https://twitter.com/ralphschindler

[83] PHP Internals News #56: https://phpinternals.news/56

[84] Dan Ackroyd: https://twitter.com/MrDanack

[85] псевдотипе mixed: https://t.me/phpdigest/147

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

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

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

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

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

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

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

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