Свежая подборка со ссылками на новости и материалы. В выпуске:
объекты в качестве ключей массивов и другие RFC предложения для PHP
8.1, запуск WebAssembly в PHP, о коллизиях в массивах, порция
полезных инструментов, статьи, видео, PHP
Дайджест Live.
Приятного чтения!
Новости и релизы
- PHP Russia переносится на 28 июня 2021 года.
- Итоги года в PHP мире Опрос сообщества Skyeng и PHP Digest. Последняя неделя, чтобы принять участие.
PHP Internals
- [RFC] Object keys in
arrays
Никита предлагает сделать возможным использование объектов в качестве ключей обычных массивов.
$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 предлагается сделать значения енамов объектами. И соответственно тогда их нельзя будет использовать в качестве ключей массивов. А это существенный минус. - [RFC] Object scoped RNG
Implementations
Функции для генерации псевдослучайных чиселrand()
илиmt_rand()
будут генерировать одну и ту же последовательность для одинакового посевного (seed) значенияsrand()
. Но из-за использования глобального состояния невозможно создать несколько генераторов с разными посевными значениями и использовать их одновременно.
Автор предлагает добавить объектный API для работы с генераторами псевдослучайных последовательностей, чтоб решить проблему глобального состояния.
$seed = 1234;$rng = new RNG\MT19937($seed);$array = [1, 2, 3, 4, 5];shuffle($array, $rng); // Результат всегда стабильный
Если нужны криптографически стойкие случайные числа, то есть, которые устойчивы к атакам, то следует использовать: random_bytes() или random_int().
- [RFC] var_representation():
readable alternative to var_export()
Функцияvar_export()
, которая выводит набор выражений в строку, давно была предметом жалоб. Как минимум был RFC с предложением сменить синтаксис массива сarray( )
на[ ]
.
Теперь же предлагается просто ввести новую функциюvar_representation($value, int $flags=0) :string
, которая исправит все недостаткиvar_export()
.
В качестве альтернативы пока можно использовать brick/varexporter. - [RFC] Change Default mysqli
Error Mode
В рамках инциативы по улучшению расширения mysqli (подробнее было в PHPLive#3 ) предлагается первый шаг: сделать режим бросания исключений в случае ошибки дефолтным. То есть это как если сейчас в приложении добавить вызов:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Из крупного опенсорса mysqli используют только CodeIgniter и WordPress. - [RFC] Dump results of
expressions in `php -a` На голосовании предложение по
улучшению интерактивного шелла
php -a
. - PHP 8.1: What's New and Changed На php.watch можно следить за тем, как будет выглядеть PHP 8.1. На сайте собраны все принятые RFC и важные пул-реквесты с описаниями.
Инструменты
- fabpot/local-php-security-checker
Проверяет composer.json на предмет наличия зависимостей с
известными уязвимостями. В качестве базы уязвимостей используется
FriendsOfPHP/security-advisories.
Можно использовать готовый GitHub action или Docker-образы от oxcom. - funivan/PhpClean Плагин для PhpStorm, который добавляет пачку интересных инспекций, например, чтоб везде были объявлены типы, не было лишних комментариев, и использовалась композиция вместо наследования. Отличный пост в поддержку.
- wasmerio/wasmer-php WebAssembly рантайм для PHP. Расширение позволяет запустить и использовать любой wasm-бинарник из PHP. То есть можно взять библиотеку на Rust, скомпилировать в wasm и использовать на любой платформе из PHP. При этом с очень высокой производительностью. Подробнее в посте автора.
- temporalio/sdk-php Антон Титов и
Кирилл Несмеянов готовят PHP-SDK для temporal.io распределенный,
масштабируемый, отказоустойчивым, высокодоступный движок, для
выполнения процессов бизнес-логики.
Пример реализации накопительной транзакции т.е. перевести деньги продавцу от нескольких покупателей в течении какого-то периода времени:Скрытый текст#[Workflow\WorkflowInterface]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, reactphp/promise, атрибуты PHP 8. Подробнее на стриме расскажет сам автор, Антон Титов.
Symfony
- chaos-php/chaos-monkey-symfony-bundle Chaos Monkey для Symfony-приложений. Пытается делать всякие экстремальные ситуации, чтобы проверить приложение на устойчивость.
- Новое в Symfony: инициатива UX новая экосистема JavaScript для Symfony
- Новое в Symfony 5.2: атрибуты PHP 8
- Неделя Symfony #734 (18-24 июня 2021)
Laravel
- umbrellio/laravel-pg-extensions Расширяем возможности миграций Laravel за счет Postgres.
- fico7489/laravel-eloquent-join Немного улучшений для джоинов в Eloquent.
- artisan.page Шпаргалка по Laravel artisan.
- Мульдоменное / multitenant приложение на Laravel и Jetstream без дополнительных пакетов.
- Непрерывная интеграция для Laravel с помощью Github Actions
- 18 советов по оптимизации запросов к базе данных
- LaravelДайджест (1824 января 2021)
Yii
- Пара обновленных компонентов: yiisoft/i18n 1.0, yiisoft/auth 2.0.
Async PHP
- walkor/Workerman Асинхронный
движок с простым API, поддержкой HTTP, WebSocket, SSL. Может
работать в связке с libevent.
Самый быстрый фреймворк на PHP в бенчмарках the-benchmarker/web-frameworks, в частности, потому что умеет из коробки стартовать пачку воркеров.
Также на его базе есть реализация socket.io сервера walkor/phpsocket.io, адаптер PSR-7,15,17 chubbyphp/chubbyphp-workerman-request-handler, и фреймворк gotzmann/comet.
Статьи
- Коллизии PHP массивов
Интересный пост о том, как можно использовать тот факт, что массивы
в PHP это хэш-таблицы, для организации DoS-атаки.
Никита в 2011 году уже писал, как вставка 2^16 = 65536 значений в PHP массив может занимать 30 секунд вместо ожидаемой 0.01 секунды. - php.watch: PHP Curl Security Hardening В статье показаны потенциально небезопасные места при использовании cURL в PHP и как защититься.
- Пишем Telegram-бота на PHP и тестируем локально с помощью beyondcode/expose.
- Делаем динамический профиль на GitHub с помощью GitHub Actions и PHP.
- Двоичные и побитовые операции в PHP.
- Трассировка и логирование в микросервисах: как мы втаскивали единый стандарт на 30 независимых команд.
- Интеграция PHP проекта на GitHub и Scrutinizer.
- Автоматизация ручных действий с GitHub Actions.
Аудио/Видео
- Xdebug 3: Diagnostics Что делать, когда Xdebug почему-то не работает.
- Как использовать терминал в PhpStorm Кстати, автор видео Christoph Rumpel запустил платный курс по PhpStorm: Mastering PhpStorm.
- Live-coding a Bref Queue Летсплей о создании отложенных задач на PHP в серверелесс-окружении. От Matthieu Napoli, автора Bref.
- PHP Release Radar #2: PHP 8 С Sara Golemon и Gabriel Caruso про 8.0, основы расширения PHP и о различных способах участия в проекте.
Сообщество
- Это не легаси-код, это PHP.
- Буря в стакане по поводу PHP
8 В декабре был пост от @jrf_nl, в котором автор
жаловалась, что в PHP 8 слишком много обратно несовместимых
изменений и обновиться очень сложно.
Эту идею подхватил и Зеев Сураски, который играл одну из ключевых ролей в развитии PHP в период 1997-2017.
В ответ Brent Roose написал свой пост и разложил, почему проблема преувеличена, а обновляться не страшно и лучше делать это регулярно.
Хотя доля правды в словах Зеева и других есть. Потому что иногда миграция может быть неочевидной. Например, вот такой код никогда не вызывал ни ошибок ни депрекейшн ноутисов, а в PHP 8.0 отвалится сTypeError
:
var_dump(round("foo"));
Или вот еще неочевидный, хоть и задокументированный, пример из слайдов:$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'
В тему хороший ресурс по обновлению и поддержке легаси кода: understandlegacycode.com. - Как выглядел бы PHP, если бы это зависело от меня Подборка желанных фич от Brent Roose: final и void по умолчанию, никакого mixed, параметры и свойства обязательно типизированные, дженерики, куда ж без них, енамы, объекты для скаляров.
Сегодня будет четвертый стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и интересными деталями, не вошедшими в текстовый выпуск. В гостях Антон Титов с рассказом про новый инструмент. А также результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность сообщите, пожалуйста, в
личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест 196