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

PHP Дайджест № 197 (11 – 25 января 2021)

PHP Дайджест № 197 (11 – 25 января 2021) - 1

Свежая подборка со ссылками на новости и материалы. В выпуске: объекты в качестве ключей массивов и другие RFC предложения для PHP 8.1, запуск WebAssembly в PHP, о коллизиях в массивах, порция полезных инструментов, статьи, видео, PHP Дайджест Live [1].

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

PHP Дайджест № 197 (11 – 25 января 2021) - 2 Новости и релизы

PHP Дайджест № 197 (11 – 25 января 2021) - 5 PHP Internals

  • [RFC] Object keys in arrays [4]
    Никита предлагает сделать возможным использование объектов в качестве ключей обычных массивов.

    $obj1 = new stdClass;
    $obj2 = new stdClass;
    
    $array = [];
    $array[$obj1] = 1;
    $array[$obj2] = 2;
    
    var_dump($array[$obj1]); // int(1)
    var_dump($array[$obj2]); // int(2)
    

    Сейчас для этого можно использовать SplObjectStorage или WeakMap, и они будут вести себя как массивы. Но все равно останутся ограничения. Например, их нельзя использовать в функциях array_* и многих других стандартных.

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

    Поводом для предложения послужил тот факт, что в RFC Enumerations [5] предлагается сделать значения енамов объектами. И соответственно тогда их нельзя будет использовать в качестве ключей массивов. А это существенный минус.

  • [RFC] Object scoped RNG Implementations [6]
    Функции для генерации псевдослучайных чисел rand() или mt_rand() будут генерировать одну и ту же последовательность для одинакового посевного (seed) значения srand(). Но из-за использования глобального состояния невозможно создать несколько генераторов с разными посевными значениями и использовать их одновременно.

    Автор предлагает добавить объектный API для работы с генераторами псевдослучайных последовательностей, чтоб решить проблему глобального состояния.

    $seed = 1234;
    $rng = new RNGMT19937($seed);
    $array = [1, 2, 3, 4, 5];
    
    shuffle($array, $rng); // Результат всегда стабильный
    

    Если нужны криптографически стойкие случайные числа, то есть, которые устойчивы к атакам, то следует использовать: random_bytes() [7] или random_int() [8].

  • [RFC] var_representation(): readable alternative to var_export() [9]
    Функция var_export(), которая выводит набор выражений в строку, давно была предметом жалоб. Как минимум был RFC [10] с предложением сменить синтаксис массива с array( ) на [ ].

    Теперь же предлагается просто ввести новую функцию var_representation($value, int $flags=0) :string, которая исправит все недостатки var_export().

    В качестве альтернативы пока можно использовать brick/varexporter [11].

  • [RFC] Change Default mysqli Error Mode [12]
    В рамках инициативы [13] по улучшению расширения mysqli (подробнее было в PHPLive#3 [14] ) предлагается первый шаг: сделать режим бросания исключений в случае ошибки дефолтным. То есть это как если сейчас в приложении добавить вызов: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Из крупного опенсорса mysqli используют только CodeIgniter и WordPress.

  • [RFC] Dump results of expressions in `php -a` [15] — На голосовании предложение по улучшению интерактивного шелла php -a.
  • PHP 8.1: What's New and Changed [16] — На php.watch можно следить за тем, как будет выглядеть PHP 8.1. На сайте собраны все принятые RFC и важные пул-реквесты с описаниями.

PHP Дайджест № 197 (11 – 25 января 2021) - 6 Инструменты

  • fabpot/local-php-security-checker [17] — Проверяет composer.json на предмет наличия зависимостей с известными уязвимостями. В качестве базы уязвимостей используется FriendsOfPHP/security-advisories [18].

    Можно использовать готовый GitHub action [19] или Docker-образы [20] от oxcom [21].

  • funivan/PhpClean [22] — Плагин для PhpStorm, который добавляет пачку интересных инспекций, например, чтоб везде были объявлены типы, не было лишних комментариев, и использовалась композиция вместо наследования. Отличный пост [23] в поддержку.
  • wasmerio/wasmer-php [24] — WebAssembly рантайм для PHP. Расширение позволяет запустить и использовать любой wasm-бинарник из PHP. То есть можно взять библиотеку на Rust, скомпилировать в wasm и использовать на любой платформе из PHP. При этом с очень высокой производительностью. Подробнее в посте [25] автора.
  • temporalio/sdk-php [26] — Антон Титов и Кирилл Несмеянов готовят PHP-SDK для temporal.io [27] – распределенный, масштабируемый, отказоустойчивым, высокодоступный движок, для выполнения процессов бизнес-логики.

    Пример реализации накопительной транзакции т.е. перевести деньги продавцу от нескольких покупателей в течении какого-то периода времени:

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

    #[WorkflowWorkflowInterface]
    class LoopWorkflow
    {
        private array $values = [];
        private array $result = [];
        private $simple;
    
        public function __construct()
        {
            $this->simple = Workflow::newActivityStub(
                SimpleActivity::class,
                ActivityOptions::new()->withStartToCloseTimeout(5)
            );
        }
    
        #[SignalMethod]
        public function addValue(
            string $value
        ) {
            $this->values[] = $value;
        }
    
        #[WorkflowMethod(name: 'LoopWorkflow')]
        public function run(
            int $count
        ) {
            while (true) {
                yield Workflow::await(fn() => $this->values !== []);
                $value = array_shift($this->values);
    
                $this->result[] = yield $this->simple->echo($value);
    
                if (count($this->result) === $count) {
                    break;
                }
            }
    
            return $this->result;
        }
    }

    Под капотом RoadRunner [28], reactphp/promise [29], атрибуты PHP 8 [30]. Подробнее на стриме [1] расскажет сам автор, Антон Титов.

PHP Дайджест № 197 (11 – 25 января 2021) - 7 Symfony

PHP Дайджест № 197 (11 – 25 января 2021) - 10 Laravel

PHP Дайджест № 197 (11 – 25 января 2021) - 15 Yii

PHP Дайджест № 197 (11 – 25 января 2021) - 16 Async PHP

  • walkor/Workerman [46] — Асинхронный движок с простым API, поддержкой HTTP, WebSocket, SSL. Может работать в связке с libevent.

    Самый быстрый фреймворк на PHP в бенчмарках the-benchmarker/web-frameworks [47], в частности, потому что умеет из коробки стартовать пачку воркеров.

    Также на его базе есть реализация socket.io сервера walkor/phpsocket.io [48], адаптер PSR-7,15,17 chubbyphp/chubbyphp-workerman-request-handler [49], и фреймворк gotzmann/comet [50].

PHP Дайджест № 197 (11 – 25 января 2021) - 17 Статьи

PHP Дайджест № 197 (11 – 25 января 2021) - 22 Аудио/Видео

PHP Дайджест № 197 (11 – 25 января 2021) - 27 Сообщество

  • habr Это не легаси-код, это PHP [67].
  • Буря в стакане по поводу PHP 8 [68] — В декабре был пост [69] от @jrf_nl [70], в котором автор жаловалась, что в PHP 8 слишком много обратно несовместимых изменений и обновиться очень сложно.
    Эту идею подхватил и Зеев Сураски, который играл одну из ключевых ролей в развитии PHP в период 1997-2017.

    В ответ Brent Roose написал свой пост и разложил, почему проблема преувеличена, а обновляться не страшно и лучше делать это регулярно.

    Хотя доля правды в словах Зеева и других есть. Потому что иногда [71] миграция может быть неочевидной. Например, вот такой код никогда не вызывал ни ошибок ни депрекейшн ноутисов, а в PHP 8.0 отвалится с TypeError:

    var_dump(round("foo"));

    3v4l.org/pU0LD [72]

    Или вот еще неочевидный, хоть и задокументированный [73], пример из слайдов [74]:

    $sub = substr('abcdef', 4, -4);
    if ($sub === false) {
        echo 'fail';
    } else {
        echo 'do something with $sub';
    }
    
    // PHP 5-7 > 'fail'
    // PHP 8   > 'do something with $sub'
    

    3v4l.org/Ln9g3 [75]

    В тему хороший ресурс по обновлению и поддержке легаси кода: understandlegacycode.com [76].

  • Как выглядел бы PHP, если бы это зависело от меня [77] — Подборка желанных фич от Brent Roose: final и void по умолчанию, никакого mixed, параметры и свойства обязательно типизированные, дженерики, куда ж без них, енамы, объекты для скаляров.


Сегодня будет четвертый стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и интересными деталями, не вошедшими в текстовый выпуск. В гостях Антон Титов с рассказом про новый инструмент. А также результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.


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

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

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

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

Источник [84]


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

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

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

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

[2] PHP Russia переносится на 28 июня 2021 года.: https://phprussia.ru/moscow/2020/articles/1501

[3] Итоги года в PHP мире: https://skyeng-school.typeform.com/to/iNfIjQbr

[4] [RFC] Object keys in arrays: https://wiki.php.net/rfc/object_keys_in_arrays

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

[6] [RFC] Object scoped RNG Implementations: https://wiki.php.net/rfc/object_scope_prng

[7] random_bytes(): https://www.php.net/manual/ru/function.random-bytes.php

[8] random_int(): https://www.php.net/manual/ru/function.random-int.php

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

[10] был RFC: https://wiki.php.net/rfc/var-export-array-syntax

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

[12] [RFC] Change Default mysqli Error Mode: https://wiki.php.net/rfc/mysqli_default_errmode

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

[14] PHPLive#3: https://www.youtube.com/watch?v=DEV3K_Tf5Do&t=276s

[15] [RFC] Dump results of expressions in `php -a`: https://wiki.php.net/rfc/readline_interactive_shell_result_function#changelog

[16] PHP 8.1: What's New and Changed: https://php.watch/versions/8.1

[17] fabpot/local-php-security-checker: https://github.com/fabpot/local-php-security-checker

[18] FriendsOfPHP/security-advisories: https://github.com/FriendsOfPHP/security-advisories

[19] GitHub action: https://github.com/marketplace/actions/php-security-checker

[20] Docker-образы: https://hub.docker.com/repository/docker/oxcom/php-security-checker

[21] oxcom: https://habr.com/ru/users/oxcom/

[22] funivan/PhpClean: https://github.com/funivan/PhpClean

[23] Отличный пост: https://funivan.com/post/phpclean-intro/

[24] wasmerio/wasmer-php: https://github.com/wasmerio/wasmer-php

[25] в посте: https://mnt.io/2019/04/03/%f0%9f%90%98%f0%9f%a6%80%f0%9f%95%b8-php-ext-wasm-migrating-from-wasmi-to-wasmer/

[26] temporalio/sdk-php: https://github.com/temporalio/sdk-php

[27] temporal.io: https://temporal.io/

[28] RoadRunner: https://github.com/spiral/roadrunner

[29] reactphp/promise: https://github.com/reactphp/promise

[30] атрибуты PHP 8: https://github.com/spiral/attributes

[31] chaos-php/chaos-monkey-symfony-bundle: https://github.com/chaos-php/chaos-monkey-symfony-bundle

[32] Chaos Monkey: https://github.com/Netflix/chaosmonkey

[33] Новое в Symfony: инициатива UX — новая экосистема JavaScript для Symfony: https://habr.com/ru/company/otus/blog/538094/

[34] Новое в Symfony 5.2: атрибуты PHP 8: https://habr.com/ru/company/otus/blog/538482/

[35] Неделя Symfony #734 (18-24 июня 2021): https://symfony.com/blog/a-week-of-symfony-734-18-24-january-2021?utm_medium=feed

[36] umbrellio/laravel-pg-extensions: https://github.com/umbrellio/laravel-pg-extensions

[37] Расширяем возможности миграций Laravel за счет Postgres: https://habr.com/ru/post/537426/

[38] fico7489/laravel-eloquent-join: https://github.com/fico7489/laravel-eloquent-join

[39] artisan.page: https://artisan.page/

[40] Мульдоменное / multitenant приложение на Laravel и Jetstream: https://www.youtube.com/watch?v=5CjWPU7lns4

[41] Непрерывная интеграция для Laravel с помощью Github Actions: https://laravel.demiart.ru/continuous-integration-github-actions/

[42] 18 советов по оптимизации запросов к базе данных: https://laravel.demiart.ru/laravel-database-queries-optimization/

[43] Laravel–Дайджест (18–24 января 2021): https://habr.com/ru/post/538902/

[44] yiisoft/i18n 1.0: https://github.com/yiisoft/i18n

[45] yiisoft/auth 3.0: https://github.com/yiisoft/auth

[46] walkor/Workerman: https://github.com/walkor/Workerman

[47] the-benchmarker/web-frameworks: https://github.com/the-benchmarker/web-frameworks

[48] walkor/phpsocket.io: https://github.com/walkor/phpsocket.io

[49] chubbyphp/chubbyphp-workerman-request-handler: https://github.com/chubbyphp/chubbyphp-workerman-request-handler

[50] gotzmann/comet: https://github.com/gotzmann/comet

[51] Коллизии PHP массивов: https://sorin.live/colliding-php-arrays/

[52] в 2011 году уже писал: https://nikic.github.io/2011/12/28/Supercolliding-a-PHP-array.html

[53] php.watch: PHP Curl Security Hardening: https://php.watch/articles/php-curl-security-hardening

[54] Пишем Telegram-бота на PHP: https://pretzelhands.com/posts/build-a-telegram-bot-in-php

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

[56] Делаем динамический профиль на GitHub: https://hackernoon.com/how-to-build-a-dynamic-github-profile-with-github-actions-and-php-h5g34cr

[57] Двоичные и побитовые операции в PHP: https://habr.com/ru/company/mailru/blog/538052/

[58] Трассировка и логирование в микросервисах: https://habr.com/ru/company/skyeng/blog/531858/

[59] Интеграция PHP проекта на GitHub и Scrutinizer: https://habr.com/ru/post/537088/

[60] Автоматизация ручных действий с GitHub Actions: https://habr.com/ru/post/537014/

[61] Xdebug 3: Diagnostics: https://www.youtube.com/watch?v=IN6ihpJSFDw

[62] Как использовать терминал в PhpStorm: https://www.youtube.com/watch?v=h1sGfV5i_kI

[63] Mastering PhpStorm: https://masteringphpstorm.com

[64] Live-coding a Bref Queue: https://www.youtube.com/watch?v=tVsnbvCd6Wg

[65] Bref: https://github.com/brefphp/bref

[66] PHP Release Radar #2: PHP 8: https://www.youtube.com/watch?v=piFQSkVU3mw

[67] Это не легаси-код, это PHP: https://habr.com/ru/company/vdsina/blog/537034/

[68] Буря в стакане по поводу PHP 8: https://stitcher.io/blog/a-storm-in-a-glass-of-water

[69] пост: https://24daysindecember.net/2020/12/21/a-perfect-storm/

[70] @jrf_nl: https://twitter.com/jrf_nl

[71] иногда: https://externals.io/message/112909#112910

[72] 3v4l.org/pU0LD: https://3v4l.org/pU0LD

[73] задокументированный: https://www.php.net/manual/ru/function.substr.php#refsect1-function.substr-changelog

[74] из слайдов: https://speakerdeck.com/jrf/php-8-and-legacy-code?slide=6

[75] 3v4l.org/Ln9g3: https://3v4l.org/Ln9g3

[76] understandlegacycode.com: https://understandlegacycode.com

[77] Как выглядел бы PHP, если бы это зависело от меня: https://stitcher.io/blog/php-reimagined

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

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

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

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

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

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

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