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

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

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

В PHP 8.1 будет enum, и еще два принятых, два отклоненных и три новых RFC предложения для PHP 8.1. WordPress используется на 40% сайтов. Почему нужно убрать strict_types, почему не стоит использовать empty(), а также инструменты, видео, статьи, подкасты, и PHP Дайджест Live [1] в 20:00 МСК.

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

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

PHP Дайджест № 199 (8 – 22 февраля 2021) - 5 PHP Internals

  • check [RFC] Enumerations [12]
    С результатом 44 против 7 голосование завершено. В PHP 8.1 будет enum.

    enum RfcStatus {
        case Draft;
        case UnderDiscussion;
        case Accepted;
    }
    
    function setRfcStatus(RfcStatus $status) :void {
        // ...
    }
    
    setRFCStatus(RfcStatus::Accepted); // Ок
    setRFCStatus('Draft');             // TypeError
    

    Подробнее про инамы можно прочитать в пересказах RFC в статье Брента [13] и еще подробнее на php.watch [14].

    В Symfony уже открыли тикеты [15] для добавления поддержки инамов.

  • check [RFC] Deprecate passing null to non-nullable arguments of internal functions [16]
    В текущих версиях PHP стандартные функции без ошибок принимают null в качестве аргумента, когда параметр не nullable.

    А начиная с PHP 8.1 встроенные функции тоже будут бросать TypeError. Например, str_contains("", null). 3v4l.org/OVoa0A [17].

    Интересный факт: предложение принято единогласно, притом что это довольно крупная поломка обратной совместимости в PHP.

  • check [RFC] Array unpacking with string keys [18]
    Предложение принято и в PHP 8.1 будет работать распаковка любых массивов, в том числе со строковыми ключами:

    $array1 = ['a' => 'apple', 'p' => 'pear'];
    $array2 = ['b' => 'banana', 'o' => 'orange'];
    $array = [...$array1, ...$array2];
    // Приблизительно то же самое что:
    $array = array_merge($array1, $array2);
    
  • [RFC] Fibers [19]
    Из предложения по файберам был убран планировщик, потому что он сильно усложнял реализацию и вероятность принятия предложения.

    Теперь Fiber API предоставляет самый минимум и похож на аналогичные возможности в Ruby.

    Пример использования с ReactPHP trowski/react-fiber [20]:

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

    
    $loop = new FiberLoop(Factory::create());
    
    $browser = new Browser($loop);
    
    $request = function (string $method, string $url) use ($browser, $loop): void {
        /** @var Response $response */
        $response = $loop->await($browser->requestStreaming($method, $url));
    
        /** @var ReadableStreamInterface $stream */
        $stream = $response->getBody();
    
        $body = $loop->await(Streambuffer($stream));
    
        var_dump(sprintf(
            '%s %s; Status: %d; Body length: %d',
            $method,
            $url,
            $response->getStatusCode(),
            strlen($body)
        ));
    };
    
    $requests = [];
    
    $requests[] = $loop->async($request, 'GET', 'https://reactphp.org');
    $requests[] = $loop->async($request, 'GET', 'https://google.com');
    $requests[] = $loop->async($request, 'GET', 'https://www.php.net');
    
    $loop->await(Promiseall($requests));
    
  • [RFC] CachedIterable (rewindable, allows any key&repeating keys) [21]
    Tyson Andre предлагает добавить кеширующий итератор. Он сохраняет состояние любого итератора и внутри себя содержит иммутабельные копии его ключей и значений.
  • Proposal: namespace the SPL [22]
    Обсуждается предложение создать неймспейс Spl и создать в нем алиасы для существующих классов: SplFixedArray -> SplFixedArray. А все новые классы, такие как CachedIterable и ReverseIterator уже вносить сразу в новый неймспейс.

    А пока в качестве альтернативы есть отличный инструмент azjezz/psl [23].

  • [RFC] mysqli bind in execute [24]
    Kamil Tekiela продолжает инициативу [25] по улучшению mysqli. В этом RFC предлагает добавить новый необязательный параметр в mysqli_stmt::execute(). Он будет принимать массив значений, которые автоматически биндятся, вместо отдельного вызова mysqli_stmt::bind_param(). К слову, сейчас bind_param принимает только переменные по ссылке.
  • cross [RFC] PHPiterableany() and all() on iterables [26] — Предложение добавить функции any() и all() для итераторов не прошло голосование.
  • cross [RFC] var_representation(): readable alternative to var_export() [27] — Идея добавить альтернативу для var_export не нашла поддержки, поэтому пока используем юзерленд альтернативу brick/varexporter [28].
  • [Draft] Unify PHP's typing modes [29] — В PHP по сути есть два режима типизации. Один — слишком слабый, а другой, – strict_types=1 – слишком строгий. Этот документ описывает причины существования этих двух режимов, их недостатки и что нужно сделать, чтобы объединять оба режима.

    Документ написан George Peter Banyard [30], и пока он не планирует его выдвигать в качестве официального RFC.

    Разберем его положения на стриме [31].

  • Об Observer API в PHP 8 [32] — Статья о внутреннем API для отслеживания входа и выхода из функции. Он существенно упростил разработку расширений типа Xdebug, профайлеров и APM-решений New Relic, Tideways, и т.п.

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

  • renoki-co/php-k8s [33] — Позволяет управлять ресурсами кубернетиса из PHP.
  • marcocesarato/php-conventional-changelog [34] — Генерирует changelog из сообщений коммитов.
  • andrey-helldar/package-wizard [35] — CLI-инструмент для создания начальной структуры пакетов.
  • rryqszq4/ngx_php7 [36] — Встраиваемый в nginx интерпретатор PHP. Позволяет создавать обработчики запросов на PHP, модифицировать запрос/ответ, фильтровать тело ответа и заголовки, и прочее.

PHP Дайджест № 199 (8 – 22 февраля 2021) - 12 Symfony

PHP Дайджест № 199 (8 – 22 февраля 2021) - 13 Laravel

PHP Дайджест № 199 (8 – 22 февраля 2021) - 16 Yii

PHP Дайджест № 199 (8 – 22 февраля 2021) - 17 Async PHP

  • swow/swow [50] — Расширение для PHP, которое предоставляет асинхронные возможности на базе libuv, включая асинхронный стрим, то есть из коробки работающие PDO, file_get_сontents() и т.п. (когда они обернуты в корутину). По сути, является минималистичным подмножеством Swoole.

phpstorm PhpStorm

PHP Дайджест № 199 (8 – 22 февраля 2021) - 20 Статьи

PHP Дайджест № 199 (8 – 22 февраля 2021) - 28 Аудио/Видео

PHP Дайджест № 199 (8 – 22 февраля 2021) - 39 Занимательное

  • mario-deluna/php-render [74] — 3D рендерер на чистом PHP, даже без использования FFI. Шейдеры, парсер .obj файлов и прочее.
    Код [75] примера:
    PHP Дайджест № 199 (8 – 22 февраля 2021) - 40


Уже традиционный стрим по мотивам PHP Дайджеста. Будет разбор новостей и ссылок из выпуска с подробностями и дополнительными деталями.
Начало в 20:00 Москва, Минск / 19:00 Киев.


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

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

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

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

Источник [82]


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

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

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

[1] PHP Дайджест Live: https://www.youtube.com/watch?v=n5b4EnFAxfE

[2] PhpStorm 2021.1 EAP: https://blog.jetbrains.com/phpstorm/2021/02/phpstorm-2021-1-eap-2/

[3] через Code With Me: https://blog.jetbrains.com/blog/2021/02/16/code-with-me-beta-support-for-audio-and-video-calls/

[4] xdebug.cloud: https://xdebug.cloud/

[5] Доля WordPress перевалила за 40% среди топ 10 млн сайтов: https://w3techs.com/technologies/overview/content_management

[6] Подробнее: https://w3techs.com/blog/entry/40_percent_of_the_web_uses_wordpress

[7] исторический тренд: https://w3techs.com/technologies/history_overview/content_management/all/y

[8] Каким будет 2021-й год для PHP?: https://habr.com/ru/company/skyeng/blog/542070/

[9] большой стрим: https://www.youtube.com/watch?v=6JF2U39J4RY

[10] 25 февраля, 19:00 МСК онлайн митап от PHP of By: https://t.me/phpofby/5843

[11] phpcommunity.ru: https://phpcommunity.ru/#rec242797866

[12] [RFC] Enumerations: https://wiki.php.net/rfc/enumerations

[13] статье Брента: https://stitcher.io/blog/php-enums

[14] на php.watch: https://php.watch/versions/8.1/enums

[15] открыли тикеты: https://github.com/symfony/symfony/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+enum+label%3A%22Help+wanted%22

[16] [RFC] Deprecate passing null to non-nullable arguments of internal functions: https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg

[17] 3v4l.org/OVoa0A: https://3v4l.org/OVoa0A

[18] [RFC] Array unpacking with string keys: https://wiki.php.net/rfc/array_unpacking_string_keys

[19] [RFC] Fibers: https://wiki.php.net/rfc/fibers

[20] trowski/react-fiber: https://github.com/trowski/react-fiber

[21] [RFC] CachedIterable (rewindable, allows any key&repeating keys): https://wiki.php.net/rfc/cachediterable

[22] Proposal: namespace the SPL: https://externals.io/message/113141

[23] azjezz/psl: https://github.com/azjezz/psl

[24] [RFC] mysqli bind in execute: https://wiki.php.net/rfc/mysqli_bind_in_execute

[25] инициативу: https://wiki.php.net/rfc/improve_mysqli

[26] [RFC] PHPiterableany() and all() on iterables: https://wiki.php.net/rfc/any_all_on_iterable

[27] [RFC] var_representation(): readable alternative to var_export(): https://wiki.php.net/rfc/readable_var_representation

[28] brick/varexporter: https://github.com/brick/varexporter

[29] [Draft] Unify PHP's typing modes: https://github.com/Girgias/unify-typing-modes-rfc

[30] George Peter Banyard: https://github.com/sponsors/Girgias

[31] на стриме: #digest-live

[32] Об Observer API в PHP 8: https://www.datadoghq.com/blog/engineering/php-8-observability-baked-right-in/

[33] renoki-co/php-k8s: https://github.com/renoki-co/php-k8s

[34] marcocesarato/php-conventional-changelog: https://github.com/marcocesarato/php-conventional-changelog

[35] andrey-helldar/package-wizard: https://github.com/andrey-helldar/package-wizard

[36] rryqszq4/ngx_php7: https://github.com/rryqszq4/ngx_php7

[37] symfony/panther 1.0: https://github.com/symfony/panther

[38] Как эффективно использовать компонент Symfony Lock на примере с Messenger: https://developer.happyr.com/symfony-lock-and-messenger-component

[39] Аутентификация и авторизация пользователей с общей сессией в микросервисах: https://carlos-compains.medium.com/user-authentication-and-authorization-with-shared-session-in-a-micro-services-architecture-b2dd43043efd

[40] Неделя Symfony #738 (15-21 февраля 2021): https://symfony.com/blog/a-week-of-symfony-738-15-21-february-2021

[41] Тестирование middleware в Laravel: https://www.kai-sassnowski.com/post/testing-http-middleware-in-laravel/

[42] Тред с советами по перфомансу Laravel: https://threadreaderapp.com/thread/1356292193032368128

[43] Laravel Internals #4: https://www.youtube.com/watch?v=N7BBLWnHhJ8

[44] Laravel–Дайджест (8–21 февраля 2021): https://habr.com/ru/post/543556/

[45] yiisoft/files: https://github.com/yiisoft/files

[46] yiisoft/var-dumper: https://github.com/yiisoft/var-dumper

[47] yiisoft/auth-jw: https://github.com/yiisoft/auth-jwt

[48] yiisoft/log: https://github.com/yiisoft/log

[49] yiisoft/event-dispatcher: https://github.com/yiisoft/event-dispatcher

[50] swow/swow: https://github.com/swow/swow

[51] Как делать рефакторинг в PhpStorm: https://www.youtube.com/watch?v=LamxHRmwK2Q&list=PLQ176FUIyIUZjFbdm7Ux3Okalij5jMAgw&index=6

[52] 26 трюков и советов по PhpStorm: https://twitter.com/i/events/1268886882013917184

[53] Как защититься от Dependency Confusion в PHP: https://habr.com/ru/company/vdsina/blog/542598/

[54] Когда использовать empty() в PHP? Я бы сказал никогда.: https://beberlei.de/2021/02/19/when_to_use_empty_in_php_i_say_never.html

[55] Введение в мутационное тестирование на PHP: https://johnbraun.blog/posts/mutation-testing

[56] MySQL под нагрузкой > 40000 QPS, что может пойти не так: https://telegra.ph/MySQL-pod-nagruzkoj--40-000-QPS-chto-mozhet-pojti-ne-tak-02-04

[57] Кирилл Егоров: https://t.me/HeadOfWeb

[58] Решаем проблемы с интерпретацией ошибок в сервисной архитектуре: https://habr.com/ru/company/skyeng/blog/531768/

[59] Рефакторинг пет проекта: докеризация, метрики, тесты: https://habr.com/ru/post/542978/

[60] Невидимые символы, скрывающие веб-шелл в зловредном коде на PHP: https://habr.com/ru/company/vdsina/blog/542012/

[61] SafetyNet Attestation — описание и реализация проверки на PHP: https://habr.com/ru/company/funcorp/blog/541934/

[62] Tagged Unions в PHP (примерно как в Rust): https://habr.com/ru/post/541670/

[63] Структуры с процедурами или объекты?: https://elisdn.ru/blog/142/structs-or-objects

[64] Как регистрировать и тестировать shutdown функции: https://www.youtube.com/watch?v=5eOHwubukgY

[65] Пых: https://t.me/phpyh

[66] PHP Point: https://www.youtube.com/PHPPoint

[67] Мифы о производительности приложений на PHP: https://www.youtube.com/watch?v=Jp03qL_PFDU

[68] Онлайн митап от ВсеИнструменты.Ру о PHP, MySQL, нагрузки и асинхронность: https://www.youtube.com/watch?v=eLjcP6r4YJ8

[69] Пятиминутка PHP №85: https://5minphp.ru/episode85/

[70] PHP Release Radar #5: https://www.youtube.com/watch?v=VRx2LDtJ3xo

[71] Frank de Jonge: https://twitter.com/frankdejonge

[72] deprecate null, and array unpacking: https://phpinternals.news/76

[73] restrict globals usage, and phase out serializable: https://phpinternals.news/75

[74] mario-deluna/php-render: https://github.com/mario-deluna/php-render

[75] Код: https://github.com/mario-deluna/php-render/blob/master/examples/10_phong/model.php

[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-Дайджест № 198: https://habr.com/ru/post/541300/

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