Свежая подборка со ссылками на новости и материалы. В выпуске: релиз 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
Автор: Роман Пронский