
Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, «уязвимость» в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.
Приятного чтения!
 Новости и релизы
- PHP 8.0.1, 7.4.14, 7.3.26 — Во всех релизах исправлена уязвимость CVE-2020-7071 в функции url_parse() из-за неправильной фильтрации урлов вида 
http://php.net\@aliyun.com/aaa.do. В 8.0 и 7.4 еще дополнительно пачка исправленных багов. 
 Итоги года в PHP мире — Опрос сообщества Skyeng и PHP Digest.- Вся документация PHP наконец-то перенесена в Git: — github.com/php/doc-base!
 
 PHP Internals
- [RFC] Enumerations, Round 2 — Предложение по Enum для PHP было сильно доработано. В частности: кейсы (значения) не могут иметь методы или константы, а сам Enum может; поддерживаются трейты без свойств; в скалярных енамах вместо метода 
value()теперь просто свойство. Обзор предложения был в выпуске № 194 и на стриме. - [RFC] Bundling ext/simdjson into core — Автор предлагает забандлить в ядро PHP библиотеку simdjson. Оно в разы быстрее чем текущее ext/json и позволяет парсить гигабайтные json за секунды.
В обсуждении указали на то, что библиотека молодая и не доступна во многих инсталяциях. Поэтому пока лучше предоставлять ее в виде PECL расширения, а забандлить позже. - [RFC] Array unpacking with string keys — В 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 — Автор пул-реквеста заметил, что функция 
htmlspecialchars()почти всегда используется с флагамиENT_QUOTESиENT_SUBSTITUTE:
• ENT_QUOTES — WordPress
• ENT_QUOTES — Blade (Laravel)
• ENT_QUOTES | ENT_SUBSTITUTE — Twig (Symfony or Slim)
• ENT_QUOTES | ENT_SUBSTITUTE — CodeIgniter
• ENT_QUOTES | ENT_SUBSTITUTE — CakePHP
• ENT_QUOTES | ENT_SUBSTITUTE — Yii
Предлагается сделать эти флаги включенными по умолчанию. 
 [RFC] Restrict $GLOBALS usage — Принято единогласно. Использование $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 — Рекомендованным механизмом для доступа к БД в PHP является PDO. Тем не менее во многих приложениях используется mysqli. У последнего есть ряд старых проблем, которые автор и предлагает решить.
 - [RFC] Add array_is_list(array $array): bool — Стартовало голосование по добавлению функции, которая вернет 
true, если передать в нее массив с последовательными целочисленными ключами0, 1, 2 ... count($value)-1. Функция переименована изis_list()вarray_is_list(). О причинах было подробнее на стриме.
В Symfony уже успели сделать полифил для PHP 8.1 с этой функцией. - В PHP 8.1 добавлены супербыстрые алгоритмы хеширования: xxHash и MurmurHash3.
 
 Инструменты
 Dump Debugging Evolved — Ray — Ребятки из Spatie представили свое приложение для отладки — Ray. Добавляете вызовы ray($anything)в своем коде, и при запуске PHP-скрипта оно красиво отображается в отдельном десктопном приложении.
Если вы осилили Xdebug, то вряд ли это имеет смысл. А если отлаживаете в стилеvar_dump(...)/die(), то может быть интересно.
Смотрите подробный
 видеообзор на английском или на русском в ближайшем PHP Дайджест Live.- AdamGaskins/barcoder — Пакет с лаконичным интерфейсом для генерации SVG-картинок штрихкодов (QR, Datamatrix, и т.п.).
 - vimeo/php-mysql-engine — MySQL движок на чистом PHP. Пригодится, если при тестировании вы обращаетесь к базе и хотите ускорить запуск тестов, эмулируя MySQL в памяти. Библиотека расширяет класс PDO и позволяет вызывать обычные методы PDO MySQL. Аккуратно: есть ограничения.
 - jvoisin/snuffleupagus — PHP-расширение блокирует запуск потенциально небезопасного кода в рантайме и избавляет от многих потенциальных уязвимоcтей. Изначально разработан для хостеров, которые, естественно, не могут редактировать код своих клиентов, но хотят сделать его безопаснее.
 - mbunge/php-attributes — Пакет для автоматического резолва/инициализации атрибутов PHP 8. Можно просто подключить автозагрузчик или использовать резолвер вручную.
 - mlocati/docker-php-extension-installer — Инструмент упрощает установку PHP-расширений в Docker.
 - php-opencv/php-opencv — Расширение для компьютерного зрения (распознавание лиц, объектов, и т. п.) и машинного обучения теперь с поддержкой PHP 8. Примеры использования.
 
 Symfony
- 5 новых фишек, которые можно делать на Symfony 5.2 + PHP 8.0
 - How to create service bundles for a Symfony application
 - Неделя Symfony #732 (4-10 января 2021)
 - Итоги 2020 для Symfony
 
 Laravel
- Создаём REST API с помощью tailflow/laravel-orion.
 
 Laravel–Дайджест (28 декабря 2020 – 10 января 2021)- lorisleiva/laravel-actions 2.0 — Минипакет предлагает организацию приложения в виде классов-экшнов.
 
 Подкаст Тейлора Laravel Snippet #26 — Jetstream 2.x, Forge Circles, Spark «Next», React SPAs.
 Yii
 Новости Yii 2020, выпуск 8
 E-commerce сайт на Yii 2  — Летсплей на 16 часов. Результат thecodeholic/yii2-ecommerce-website.
 Zend / Laminas
- Итоги 2020 для Laminas Project
 - В Zend Framework / Laminas зарепортили уязвимость — Суть «уязвимости» можно понять из этого примера: 
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); }
Во фреймворк запушили исправление с проверкой наis_string()перед тем как делатьunlink(). Но если посмотреть внимательнее, то уязвимость касается десериализации данных от пользователя. А на php.net красным написано, что не стоит использоватьunserializie()в подобных случаях.
Более того, с 2017 года ошибки десериализации больше не считаются ошибками безопасности, просто потому чтоunserialize()никогда не будет безопасным (не только в PHP).
Вот еще свежий пост об эксплуатации подобных багов на примере Yii. 
 Async PHP
- Swoole PHP 4.6.0 — В свежем релизе асинхронного движка добавлен нативный асинхронный сURL.
 - amphp/mysql-dbal — Концепт асинхронного драйвера для Doctrine DBAL/ORM на базе Amphp v3.
 
 Статьи
- Масштабирование PHP FPM в Kubernetes в зависимости от нагрузки.
 - Свойства объекта и иммутабельность — Подробный анализ от Лари Гарфильда того, как ограничение на запись могут быть реализованы в PHP. В качестве вывода предлагает добавить раздельные модификаторы доступа на чтение и запись, то есть отдельные public/private для get и set
и clone-with.
Во второй части Лари рассматривает все идеи из первого поста на примере PSR-7. - Фундаментальный пост о работе с двоичными и битовыми данными в PHP
 
 У Вас проблемы с legacy — значит, Вам повезло! Распил монолита на PHP
 Аудио/Видео
 PHP Дайджест Live #2: асинхронный PHP в 8.1, нативные атрибуты, слоники.
 Прагматичное введение в Event Sourcing — от автора EventSaucePHP/EventSauce.
 Видео-код-ревью от Mathhew Napoli — В этом выпуске рассматривает пакет m50/simple.
Сообщество
 60+ чатов и ютуб-каналов для PHP-разработчика, которые советуют ребята из сообщества.- Модель PHP-слоника для 3D принтера.
 - github.com/thank-you-php — Открытое письмо благодарности PHP. Можно подписаться просто отправив пул-реквест и получить бейджик 
 у себя в профиле. 
Сегодня будет третий стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и деталями, обзор присланного, интересное но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
 Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
< Предыдущий выпуск: PHP Дайджест № 195
          
 
shuchkin
Спасибо, Роман