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

PHP Дайджест № 200 (22 февраля – 15 марта 2021)

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 1

Фото: Grégoire Gaonach [1]

Свежая подборка со ссылками на новости и материалы. В выпуске: Объекты в инициализаторах, неймспейсы для расширений, и другие RFC предложения для PHP 8.1. Обновлен PSR-11, предложен PSR ClockInterface. Порция полезных инструментов, видео, подкасты, статьи, и PHP Дайджест Live в 20:00 МСК.

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

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 2 Новости и релизы

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 4 PHP Internals

  • [RFC] New in initializers [12]
    В текущих версиях PHP можно использовать только константные значения в инициализаторах, то есть в дефолтных значениях свойств, параметров, констант. Если нужно не константное значение, то свойства инициализируют в конструкторе, а аргументы — в теле методов. С константами таких вариантов сейчас вообще нет.

    Никита Попов предлагает сделать возможным использовать объекты в качестве дефолтных значений свойств, параметров, а также для любых констант и статических переменных.

    static $x = new Foo();
    
    const C = new Foo();
    
    #[AnAttribute(new Foo())]
    class Test {
        public const C = new Foo();
        public static $prop = new Foo();
        public $prop = new Foo();
    
        public function __construct(
            private Logger $logger = new NullLogger()
        ) {}
    }
    
    function test($param = new Foo()) {}
    

    Пока предложение ограничивается только оператором new, но реализация позволяет в будущем расширить для любых выражений.

    Документ содержит много подробностей и нюансов. Например, как работает рефлексия, трейты, анонимные классы, использование в атрибутах для решения проблемы вложенности, и прочее. Рассмотрим подробнее на стриме PHP Дайджест Live [13].

  • [RFC] Namespaces in bundled PHP extensions [14]
    Классы и функции, предоставляемые в PHP, в настоящее время находятся в глобальном пространстве имен. Идея почистить и распределить все по неймспейсам обсуждалась давно.

    В данном RFC предлагается отказаться от префиксов вендоров, в том числе PHP. А неймспейсами должны стать имена расширений. То есть класс OpenSSLCertificate станет OpenSSLCertificate.

    Пока правда, это касается только новых символов, а миграция существующих в рамках этого RFC не затрагивается. Но в примерах приведены возможные трансформации:
    str_contains() -> Stringcontains()
    in_array() -> Arraycontains().
    Звучит как идея для PHP 9.

  • [RFC] Static variables in inherited methods [15]
    Допустим, есть метод, в котором используется статическая переменная. Если отнаследоваться от класса с этим методом, то для наследника эта статическая переменная будет новой.

    RFC предлагает сделать единственным набор статических переменных для метода, независимо от того наследуется он или нет.

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

    class A {
        public static function counter() {
            static $i = 0;
            return ++$i;
        }
    }
    class B extends A {}
    
    var_dump(A::counter()); // int(1)
    var_dump(A::counter()); // int(2)
    var_dump(B::counter()); // int(3)
    var_dump(B::counter()); // int(4)
    

  • [RFC] Fibers [16]
    Стартовало голосование по файберам. Подробнее о том, что это было на канале [17]. Если коротко: это небольшое, но важное улучшение генераторов, которое позволит писать асинхронный код на PHP проще. Например, вот так:

    Среди голосовавших против трое мейнтенеров Swoole. Они считают, что в Swoole уже пройден весь путь по асинхронному PHP, а файберы — это попытка начать заново, и их добавление не несет пользы без других компонентов.

    Также против голосовал Joe Watkins, так как по его мнению [18] файберы не обеспечивают использование по полной всем тем, что сегодня может предложить хард/софт. В то время как расширение krakjoe/parallel [19] вполне могло бы.

    Здравое зерно в этих рассуждениях есть, и тем не менее, файберы — реальный шаг в сторону асинхронных возможностей, который не противоречит ни Swoole ни parallel.

  • [RFC] noreturn type [20]
    Авторы Psalm и PHPStan предлагают добавить новый тип в PHP — noreturn.

    Такой тип указывает на то, что функция либо всегда бросает исключение либо завершает выполнение, то есть вызывает exit(), die(), trigger_error().

    function redirect(string $uri): noreturn {
        header('Location: ' . $uri);
        exit();
    }
    
    function redirectToLoginPage(): noreturn {
        redirect('/login');
    }
    

    Подобный тип есть в Hack, в Python, уже давно используется в самих Psalm, PHPStan и в PhpStorm в виде атрибута #[NoReturn] [21] или через exitpoint в .phpstormmeta.php [22].

  • [RFC] debug_backtrace_depth(int $limit=0): int [23] — Предлагается новая функция debug_backtrace_depth(int $limit=0), которая возвращает текущий уровень глубины стека вызовов. Может быть полезно для отладки рекурсивных функций, например.

    Сейчас можно получить такое же поведение с помощью полифила: count(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit=0)).

  • [RFC] println(string $data = ''): int [24] — Предлагается добавить функцию println, которая выведет строку в stdout и завершит ее символом новой строки. Не str_contains(), конечно, но тоже занятно.

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 5 Инструменты

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 6 Symfony

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 7 Laravel

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 10 Yii

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 12 Статьи

PHP Дайджест № 200 (22 февраля – 15 марта 2021) - 16 Видео

audio Подкасты

Сообщество


После небольшого перерыва возвращаемся со стримом и ведущим Валентином Удальцовым!

Будет разбор новостей и ссылок из выпуска с подробностями и деталями, мнение Валентина по RFC и статьям. Интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.

Начало в 20:00 Москва, Минск / 19:00 Киев.


Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра [76] или телеграм [77].

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

Прислать ссылку [79]
Поиск ссылок по всем дайджестам [80]
Предыдущий выпуск: PHP-Дайджест № 199 [81]

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

Источник [82]


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

Путь до страницы источника: https://www.pvsm.ru/news/362478

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

[1] Grégoire Gaonach: https://twitter.com/GregoireGaonach

[2] PHP 8.0.3: https://www.php.net/ChangeLog-8.php#8.0.3

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

[4] Предложен на рассмотрение новый стандарт PSR ClockInterface: https://github.com/php-fig/fig-standards/pull/1224/files?short_path=bc896a1#diff-bc896a1185817987d25269d5ba746546487d954744deaf3d8ff608f9babc17df

[5] Опубликованы обновления стандарта PSR-11 Container Interface: https://github.com/php-fig/container

[6] 1.1: https://github.com/php-fig/container/pull/27/files

[7] 2.0: https://github.com/php-fig/container/pull/28/files

[8] Уязвимость в Git clone: https://blog.packagist.com/git-clone-security-vulnerability/

[9] PhpStorm 2021.1 EAP: https://blog.jetbrains.com/phpstorm/2021/03/phpstorm-2021-1-eap-7/

[10] другие улучшения: https://www.youtube.com/watch?v=K_3VcHYK-vU

[11] Composer 1.x больше не поддерживается: https://blog.packagist.com/deprecating-composer-1-support/

[12] [RFC] New in initializers: https://wiki.php.net/rfc/new_in_initializers

[13] PHP Дайджест Live: #digest-live

[14] [RFC] Namespaces in bundled PHP extensions: https://wiki.php.net/rfc/namespaces_in_bundled_extensions

[15] [RFC] Static variables in inherited methods: https://wiki.php.net/rfc/static_variable_inheritance

[16] [RFC] Fibers: https://wiki.php.net/rfc/fibers#vote

[17] на канале: https://t.me/phpdigest/204

[18] по его мнению: https://twitter.com/krakjoe/status/1363768564168163329

[19] krakjoe/parallel: https://github.com/krakjoe/parallel

[20] [RFC] noreturn type: https://wiki.php.net/rfc/noreturn_type

[21] #[NoReturn]: https://habr.com/ru/company/JetBrains/blog/531828/#noreturn

[22] в .phpstormmeta.php: https://github.com/JetBrains/phpstorm-stubs/blob/6dee0fdac60e3ae3f31b6a0d59d5ff0470060216/meta/.phpstorm.meta.php#L688

[23] [RFC] debug_backtrace_depth(int $limit=0): int: https://wiki.php.net/rfc/debug_backtrace_depth

[24] [RFC] println(string $data = ''): int: https://wiki.php.net/rfc/println

[25] spiral/RoadRunner v2.0.0 : https://github.com/spiral/roadrunner/releases/tag/v2.0.0

[26] QratorLabs/Smocky: https://github.com/QratorLabs/Smocky

[27] runkit7: https://github.com/runkit7/runkit7

[28] Сравнительный обзор библиотек для работы с markdown: https://php.watch/articles/php-markdown-libraries

[29] phpize.online: https://phpize.online/

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

[31] symfony/runtime: https://github.com/symfony/runtime

[32] В Symfony 6 минимальная версия PHP будет 8.0: https://github.com/symfony/symfony/issues/40389

[33] ansien/RapidFormBundle: https://github.com/ansien/RapidFormBundle

[34] Прагматичная архитектура на Symfony: https://medium.com/fusonic/a-pragmatic-architecture-part-1-57c29fbb8e7e

[35] Деплой Symfony приложения в Docker: https://medium.com/faun/deploy-symfony-app-in-docker-9be0c371c5c9

[36] CI/CD пайплайн для Symfony на GitLab: https://medium.com/faun/build-ci-cd-pipeline-on-symfony-app-using-gitlab-41b416aa3d7e

[37] Неделя Symfony #741 (8-14 марта 2021): https://symfony.com/blog/a-week-of-symfony-741-8-14-march-2021

[38] Разбор критической RCE уязвимости в Laravel <= v8.4.2 с debug mode: https://www.ambionics.io/blog/laravel-debug-rce

[39] facade/ignition: https://github.com/facade/ignition/pull/334

[40] Закончилась поддержка Laravel 7: https://laravelversions.com/

[41] spatie/laravel-remote: https://github.com/spatie/laravel-remote

[42] spatie/ssh: https://github.com/spatie/ssh

[43] Стрим с Freek Van der Herten: https://www.youtube.com/watch?v=3HPTh-EMY2U

[44] squirephp/squire: https://github.com/squirephp/squire

[45] Пошаговое руководство по созданию первого приложения для Laravel: https://laravel-news.com/your-first-laravel-application

[46] Laravel–Дайджест (22 февраля – 7 марта 2021): https://habr.com/ru/post/545884/

[47] Новости Yii 2021, выпуск 1: https://habr.com/ru/post/545616/

[48] yiisoft/network-utilities: https://github.com/yiisoft/network-utilities

[49] yiisoft/csrf: https://github.com/yiisoft/csrf

[50] Полное руководство по FFI в PHP: https://thephp.website/en/issue/php-ffi/

[51] Экранирование символов и числовые нотации в PHP: https://php.watch/articles/php-character-escape-sequences-numeric-notations

[52] Советы по тестированию на примерах в PHP: https://github.com/sarven/unit-testing-tips

[53] Как понять где должен быть сервис — на уровне приложения или домена?: https://matthiasnoback.nl/2021/02/does-it-belong-in-the-application-or-domain-layer/

[54] Бенчмарки PHP на процессорах arm64 vs x86_64: https://fraudmarc.com/arm64-vs-x86_64-for-php/

[55] Переход от nginx+fpm к Swoole увеличил производительность нашего PHP API на 91%: https://eldadfux.medium.com/moving-from-nginx-fpm-to-swoole-has-increased-our-php-api-performance-by-91-40f62e51a064

[56] github.com/appwrite: https://github.com/appwrite/appwrite

[57] Настраиваем отладку в PHP с Xdebug 3, Docker Compose и PhpStorm: https://matthewsetter.com/setup-step-debugging-php-xdebug3-docker/

[58] Как устроен CI в Laminas: https://mwop.net/blog/2021-03-12-laminas-ci.html

[59] Когда объектов недостаточно: https://www.tonysm.com/when-objects-are-not-enough/

[60] Run, config, run: как мы ускорили деплой конфигов в Badoo: https://habr.com/ru/company/badoo/blog/544102/

[61] Бэкдор во взломанном 1С-Битрикс: под угрозой сотни сайтов: https://habr.com/ru/post/544572/

[62] Как мы быстро распилили монолит, когда командам стало тесно: https://habr.com/ru/company/skyeng/blog/545058/

[63] Большой стрим PHP-сообщества: https://www.youtube.com/watch?v=6JF2U39J4RY

[64] О сложности домена и о провайдерах в PHP: https://www.youtube.com/watch?v=-80FAOQ4Z3k

[65] Оркестрируй это! Описываем сложные бизнес процессы на PHP: https://www.youtube.com/watch?v=0NCMEaFMj_M

[66] PHP Release Radar #6: Bref 1.0: https://www.youtube.com/watch?v=d4Z7Y_7QUlU

[67] PHP Internals News #77 : https://phpinternals.news/77

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

[69] Andreas Heigl: https://twitter.com/heiglandreas

[70] отличный доклад на PHP Russia: https://www.youtube.com/watch?v=khW3w5C9yZg&list=PLsdzlHt60Mu1mZa6u6bkH1PX8N3eG_Ifr

[71] Пятиминутка PHP №87: PHP в 2021 году: https://5minphp.ru/episode87/

[72] Пятиминутка PHP №86: План обновления на PHP 8: https://5minphp.ru/episode86/

[73] Подкаст Между скобок 12: Антон Губарев – Работа архитектора: https://soundcloud.com/between-braces/12-anton-gubarev-rabota-arkhitektora

[74] PHP 8 и развитие языка в 30 вопросах и ответах: https://habr.com/ru/company/skyeng/blog/543794/

[75] 80+ докладов и статей, которые запомнились PHP-сообществу в 2020 году: https://habr.com/ru/company/skyeng/blog/544180/

[76] личку хабра: https://habrahabr.ru/conversations/pronskiy/

[77] телеграм: https://t.me/pronskiy

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

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

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

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

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