PHP Дайджест № 196 (1 – 11 января 2021)
Свежая подборка со ссылками на новости и материалы. В выпуске: релиз PHP 8.0.1, MySQL движок на PHP от Vimeo и другие релизы, обновленный Enum и свежие предложения для PHP 8.1, «уязвимость» в Laminas, инструменты, статьи, видео, PHP Дайджест Live в 20:00 МСК.
Приятного чтения!
Новости и релизы
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
Laravel
Yii
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 Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и деталями, обзор присланного, интересное, но не вошедшее в выпуск, результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP Дайджест № 195