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

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

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

Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, «уязвимость» в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.

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

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

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

  • [RFC] Enumerations, Round 2 [8] — Предложение по Enum для PHP было сильно доработано. В частности: кейсы (значения) не могут иметь методы или константы, а сам Enum может; поддерживаются трейты без свойств; в скалярных енамах вместо метода value() теперь просто свойство. Обзор предложения был в выпуске № 194 [9] и на стриме [10].
  • [RFC] Bundling ext/simdjson into core [11] — Автор предлагает забандлить в ядро PHP библиотеку simdjson [12]. Оно в разы быстрее [13] чем текущее ext/json и позволяет парсить гигабайтные json за секунды.

    В обсуждении указали на то, что библиотека молодая и не доступна во многих инсталяциях. Поэтому пока лучше предоставлять ее в виде PECL расширения, а забандлить позже.

  • [RFC] Array unpacking with string keys [14] — В PHP 5.6 была добавлена распаковка массива в аргументах:
    variadic_function(...['apple', 'banana', 'lemon']);

    А в PHP 7.4 то же самое в массивах:

    $parts = ['apple', 'pear'];
    $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
    // ['banana', 'orange', 'apple', 'pear', 'watermelon'];
    

    Но оба случая не поддерживали массивы со строковыми ключами. И поскольку с добавлением именованных аргументов в PHP 8.0 уже решен первый случай, то теперь нет причин сохранять ограничение для второго.

    В PHP 8.1 предлагается разрешить распаковку массивов со строковыми ключами:

    $array1 = ['a' => 'apple', 'p' => 'pear'];
    $array2 = ['b' => 'banana', 'o' => 'orange'];
    $array = [...$array1, ...$array2];
    // Приблизительно то же самое что:
    $array = array_merge($array1, $array2);
    
  • [PR] Use 'ENT_QUOTES|ENT_SUBSTITUTE' for HTML encoding and decoding functions [15] — Автор пул-реквеста заметил, что функция htmlspecialchars() почти всегда используется с флагами ENT_QUOTES и ENT_SUBSTITUTE:

    • ENT_QUOTES — WordPress [16]
    • ENT_QUOTES — Blade (Laravel) [17]
    • ENT_QUOTES | ENT_SUBSTITUTE — Twig (Symfony or Slim) [18]
    • ENT_QUOTES | ENT_SUBSTITUTE — CodeIgniter [19]
    • ENT_QUOTES | ENT_SUBSTITUTE — CakePHP [20]
    • ENT_QUOTES | ENT_SUBSTITUTE — Yii [21]
    Предлагается сделать эти флаги включенными по умолчанию.

  • check [RFC] Restrict $GLOBALS usage [22] — Принято единогласно. Использование $GLOBALS начиная с PHP 8.1
    будет ограничено

    Продолжат работать чтение, запись, isset и unset:

    $GLOBALS['x'] = 1;
    
    echo $GLOBALS['x']
    
    isset($GLOBALS['x']);
    unset($GLOBALS['x']);

    А вот попытка изменить саму переменную $GLOBALS вызовет ошибку:

    $GLOBALS = [];
    $GLOBALS =& $x;
    $x =& $GLOBALS;
    unset($GLOBALS);

    Также ошибка будет, если передать $GLOBALS по ссылке в функцию:

    
    asort($GLOBALS);
    // > Compile-time error

    Все это упрощает внутренности PHP и улучшает производительность операций с массивами в PHP.

  • [RFC] Concepts to improve mysqli extension [23] — Рекомендованным механизмом для доступа к БД в PHP является PDO. Тем не менее во многих приложениях используется mysqli [24]. У последнего есть ряд старых проблем, которые автор и предлагает решить.
  • [RFC] Add array_is_list(array $array): bool [25] — Стартовало голосование по добавлению функции, которая вернет true, если передать в нее массив с последовательными целочисленными ключами 0, 1, 2 ... count($value)-1. Функция переименована из is_list() в array_is_list(). О причинах было подробнее на стриме [26].

    В Symfony уже успели сделать полифил для PHP 8.1 [27] с этой функцией.

  • В PHP 8.1 добавлены супербыстрые алгоритмы хеширования: xxHash [28] и MurmurHash3 [29].

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

  • dollar Dump Debugging Evolved — Ray [30] — Ребятки из Spatie представили свое приложение для отладки — Ray [31]. Добавляете вызовы ray($anything) в своем коде, и при запуске PHP-скрипта оно красиво отображается в отдельном десктопном приложении.

    Если вы осилили Xdebug, то вряд ли это имеет смысл. А если отлаживаете в стиле var_dump(...)/die(), то может быть интересно.

    Смотрите подробный video видеообзор на английском [32] или на русском в ближайшем PHP Дайджест Live [33].

  • AdamGaskins/barcoder [34] — Пакет с лаконичным интерфейсом для генерации SVG-картинок штрихкодов (QR, Datamatrix, и т.п.).
  • vimeo/php-mysql-engine [35] — MySQL движок на чистом PHP. Пригодится, если при тестировании вы обращаетесь к базе и хотите ускорить запуск тестов, эмулируя MySQL в памяти. Библиотека расширяет класс PDO и позволяет вызывать обычные методы PDO MySQL. Аккуратно: есть ограничения [36].
  • jvoisin/snuffleupagus [37] — PHP-расширение блокирует запуск потенциально небезопасного кода в рантайме и избавляет от многих потенциальных уязвимоcтей. Изначально разработан для хостеров, которые, естественно, не могут редактировать код своих клиентов, но хотят сделать его безопаснее.
  • mbunge/php-attributes [38] — Пакет для автоматического резолва/инициализации атрибутов PHP 8 [39]. Можно просто подключить автозагрузчик или использовать резолвер вручную.
  • mlocati/docker-php-extension-installer [40] — Инструмент упрощает установку PHP-расширений в Docker.
  • php-opencv/php-opencv [41] — Расширение для компьютерного зрения (распознавание лиц, объектов, и т. п.) и машинного обучения теперь с поддержкой PHP 8. Примеры [42] использования.

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

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

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

PHP Дайджест № 196 (1 – 11 января 2021) - 16 Zend / Laminas

  • Итоги 2020 для Laminas Project [55]
  • В Zend Framework / Laminas зарепортили уязвимость [56] — Суть «уязвимости» можно понять из этого примера:
    class MyClassWithToString {
        public $name;
    
        public function __construct($name) {
            $this->name = $name;
        }
    
        public function __toString() {
            return (string) $this->name;
        }
    }
    
    $input = unserialize('O:19:"MyClassWithToString":1:{s:4:"name";s:15:"/tmp/etc/passwd";}');
    if ($input instanceof MyClassWithToString) {
        unlink($input);
    }

    Во фреймворк запушили исправление [57] с проверкой на is_string() перед тем как делать unlink(). Но если посмотреть внимательнее, то уязвимость касается десериализации данных от пользователя. А на php.net красным написано, что не стоит использовать unserializie() в подобных случаях.

    Более того, с 2017 года [58] ошибки десериализации больше не считаются ошибками безопасности, просто потому что unserialize() никогда не будет безопасным (не только в PHP).

    Вот еще свежий пост об эксплуатации подобных багов [61] на примере Yii.

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

  • Swoole PHP 4.6.0 [62] — В свежем релизе асинхронного движка добавлен нативный асинхронный сURL.
  • amphp/mysql-dbal [63] — Концепт асинхронного драйвера для Doctrine DBAL/ORM на базе Amphp v3.

PHP Дайджест № 196 (1 – 11 января 2021) - 18 Статьи

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

Сообщество


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


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

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

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

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

Источник [83]


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

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

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

[1] PHP 8.0.1: https://www.php.net/ChangeLog-8.php#8.0.1

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

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

[4] CVE-2020-7071: https://security.archlinux.org/CVE-2020-7071

[5] Итоги года в PHP мире: https://habr.com/ru/company/skyeng/blog/535894/

[6] перенесена в Git:: https://externals.io/message/112662

[7] github.com/php/doc-base: https://github.com/php/doc-base

[8] [RFC] Enumerations, Round 2: https://wiki.php.net/rfc/enumerations

[9] № 194: https://habr.com/ru/post/532950/

[10] на стриме: https://youtu.be/i9iC58z0yHE?t=2208

[11] [RFC] Bundling ext/simdjson into core: https://externals.io/message/112638

[12] simdjson: https://github.com/simdjson/simdjson

[13] в разы быстрее: https://github.com/php/php-src/pull/6551

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

[15] [PR] Use 'ENT_QUOTES|ENT_SUBSTITUTE' for HTML encoding and decoding functions: https://github.com/php/php-src/pull/6583

[16] WordPress: https://developer.wordpress.org/reference/functions/esc_html/

[17] Blade (Laravel): https://github.com/illuminate/support/blob/master/helpers.php#L118

[18] Twig (Symfony or Slim): https://github.com/twigphp/Twig/blob/3.x/src/Extension/EscaperExtension.php#L243

[19] CodeIgniter: https://github.com/codeigniter4/CodeIgniter4/blob/develop/system/ThirdParty/Escaper/Escaper.php#L120

[20] CakePHP: https://github.com/cakephp/cakephp/blob/master/src/Core/functions.php#L67

[21] Yii: https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseHtml.php#L111

[22] [RFC] Restrict $GLOBALS usage: https://wiki.php.net/rfc/restrict_globals_usage

[23] [RFC] Concepts to improve mysqli extension: https://wiki.php.net/rfc/improve_mysqli

[24] mysqli: https://www.php.net/manual/en/intro.mysqli.php

[25] [RFC] Add array_is_list(array $array): bool: https://wiki.php.net/rfc/is_list

[26] на стриме: https://youtu.be/mvjj_YX_BqQ?t=1946

[27] полифил для PHP 8.1: https://github.com/symfony/polyfill-php81

[28] xxHash: https://php.watch/versions/8.1/xxHash

[29] MurmurHash3: https://php.watch/versions/8.1/MurmurHash3

[30] Dump Debugging Evolved — Ray: https://freek.dev/1868-introducing-ray-a-debugging-tool-for-pragmatic-developers

[31] Ray: https://myray.app/

[32] видеообзор на английском: https://www.youtube.com/watch?v=8F2SrxB4O2E

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

[34] AdamGaskins/barcoder: https://github.com/AdamGaskins/barcoder

[35] vimeo/php-mysql-engine: https://github.com/vimeo/php-mysql-engine

[36] есть ограничения: https://github.com/vimeo/php-mysql-engine#caveat-emptor

[37] jvoisin/snuffleupagus: https://github.com/jvoisin/snuffleupagus

[38] mbunge/php-attributes: https://github.com/mbunge/php-attributes

[39] атрибутов PHP 8: https://www.php.net/manual/ru/language.attributes.php

[40] mlocati/docker-php-extension-installer: https://github.com/mlocati/docker-php-extension-installer

[41] php-opencv/php-opencv: https://github.com/php-opencv/php-opencv

[42] Примеры: https://github.com/php-opencv/php-opencv-examples

[43] 5 новых фишек, которые можно делать на Symfony 5.2 + PHP 8.0: https://tomasvotruba.com/blog/2020/12/21/5-new-combos-opened-by-symfony-52-and-php-80/

[44] How to create service bundles for a Symfony application: https://macrini.medium.com/how-to-create-service-bundles-for-a-symfony-application-f266ecf01fca

[45] Неделя Symfony #732 (4-10 января 2021): https://symfony.com/blog/a-week-of-symfony-732-4-10-january-2021

[46] Итоги 2020 для Symfony: https://symfony.com/blog/symfony-2020-year-in-review

[47] Создаём REST API с помощью: https://phpprofi.ru/blogs/post/121

[48] tailflow/laravel-orion: https://github.com/tailflow/laravel-orion

[49] Laravel–Дайджест (28 декабря 2020 – 10 января 2021): https://habr.com/ru/post/536628/

[50] lorisleiva/laravel-actions 2.0: https://github.com/lorisleiva/laravel-actions

[51] Подкаст Тейлора Laravel Snippet #26: https://blog.laravel.com/laravel-snippet-26

[52] Новости Yii 2020, выпуск 8: https://habr.com/ru/post/535580/

[53] E-commerce сайт на Yii 2 : https://www.youtube.com/watch?v=eQdDBhQpU9o&list=PLLQuc_7jk__UvpbpU3no5zveJQAwID48B

[54] thecodeholic/yii2-ecommerce-website: https://github.com/thecodeholic/yii2-ecommerce-website

[55] Итоги 2020 для Laminas Project: https://www.zend.com/blog/laminas-2020

[56] В Zend Framework / Laminas зарепортили уязвимость: https://www.bleepingcomputer.com/news/security/zend-framework-disputes-rce-vulnerability-issues-patch/

[57] исправление: https://github.com/laminas/laminas-http/pull/48

[58] с 2017 года: https://externals.io/message/100147

[59] https://t.co/8GZb1xqE1u: https://t.co/8GZb1xqE1u

[60] August 10, 2017: https://twitter.com/nikita_ppv/status/895571304325062656

[61] пост об эксплуатации подобных багов: https://blog.redteam-pentesting.de/2021/deserialization-gadget-chain/

[62] Swoole PHP 4.6.0: https://www.swoole.co.uk/article/v4-6-0-released

[63] amphp/mysql-dbal: https://github.com/amphp/mysql-dbal

[64] Масштабирование PHP FPM в Kubernetes в зависимости от нагрузки: https://blog.wyrihaximus.net/2021/01/scaling-php-fpm-based-on-utilization-demand-on-kubernetes/

[65] Свойства объекта и иммутабельность: https://peakd.com/hive-168588/@crell/object-properties-and-immutability

[66] второй части: https://peakd.com/hive-168588/@crell/object-properties-part-2-examples

[67] Фундаментальный пост о работе с двоичными и битовыми данными в PHP: https://thephp.website/en/issue/bitwise-php/

[68] У Вас проблемы с legacy — значит, Вам повезло! Распил монолита на PHP: https://habr.com/ru/post/536238/

[69] PHP Дайджест Live #2: https://www.youtube.com/watch?v=mvjj_YX_BqQ

[70] Прагматичное введение в Event Sourcing: https://www.youtube.com/watch?v=xHbP3bshU3U

[71] EventSaucePHP/EventSauce: https://github.com/EventSaucePHP/EventSauce

[72] Видео-код-ревью от Mathhew Napoli: https://www.youtube.com/watch?v=GqUvoK7PfOA

[73] m50/simple: https://github.com/m50/simple

[74] 60+ чатов и ютуб-каналов для PHP-разработчика: https://habr.com/ru/company/skyeng/blog/534758/

[75] Модель PHP-слоника для 3D принтера: https://cults3d.com/en/3d-model/various/elephpant-3d

[76] github.com/thank-you-php: https://github.com/thank-you-php/thank-you-php

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

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

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

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

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

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

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