- PVSM.RU - https://www.pvsm.ru -
Свежая подборка со ссылками на новости и материалы. В выпуске: объекты в качестве ключей массивов и другие RFC предложения для PHP 8.1, запуск WebAssembly в PHP, о коллизиях в массивах, порция полезных инструментов, статьи, видео, PHP Дайджест Live [1].
Приятного чтения!
$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 [5] предлагается сделать значения енамов объектами. И соответственно тогда их нельзя будет использовать в качестве ключей массивов. А это существенный минус.
rand()
или mt_rand()
будут генерировать одну и ту же последовательность для одинакового посевного (seed) значения srand()
. Но из-за использования глобального состояния невозможно создать несколько генераторов с разными посевными значениями и использовать их одновременно.
Автор предлагает добавить объектный API для работы с генераторами псевдослучайных последовательностей, чтоб решить проблему глобального состояния.
$seed = 1234;
$rng = new RNGMT19937($seed);
$array = [1, 2, 3, 4, 5];
shuffle($array, $rng); // Результат всегда стабильный
Если нужны криптографически стойкие случайные числа, то есть, которые устойчивы к атакам, то следует использовать: random_bytes() [7] или random_int() [8].
var_export()
, которая выводит набор выражений в строку, давно была предметом жалоб. Как минимум был RFC [10] с предложением сменить синтаксис массива с array( )
на [ ]
.
Теперь же предлагается просто ввести новую функцию var_representation($value, int $flags=0) :string
, которая исправит все недостатки var_export()
.
В качестве альтернативы пока можно использовать brick/varexporter [11].
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Из крупного опенсорса mysqli используют только CodeIgniter и WordPress.
php -a
.Можно использовать готовый GitHub action [19] или Docker-образы [20] от oxcom [21].
Пример реализации накопительной транзакции т.е. перевести деньги продавцу от нескольких покупателей в течении какого-то периода времени:
#[WorkflowWorkflowInterface]
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 [28], reactphp/promise [29], атрибуты PHP 8 [30]. Подробнее на стриме [1] расскажет сам автор, Антон Титов.
Самый быстрый фреймворк на PHP в бенчмарках the-benchmarker/web-frameworks [47], в частности, потому что умеет из коробки стартовать пачку воркеров.
Также на его базе есть реализация socket.io сервера walkor/phpsocket.io [48], адаптер PSR-7,15,17 chubbyphp/chubbyphp-workerman-request-handler [49], и фреймворк gotzmann/comet [50].
Никита в 2011 году уже писал [52], как вставка 2^16 = 65536 значений в PHP массив может занимать 30 секунд вместо ожидаемой 0.01 секунды.
В ответ Brent Roose написал свой пост и разложил, почему проблема преувеличена, а обновляться не страшно и лучше делать это регулярно.
Хотя доля правды в словах Зеева и других есть. Потому что иногда [71] миграция может быть неочевидной. Например, вот такой код никогда не вызывал ни ошибок ни депрекейшн ноутисов, а в PHP 8.0 отвалится с TypeError
:
var_dump(round("foo"));
3v4l.org/pU0LD [72]
Или вот еще неочевидный, хоть и задокументированный [73], пример из слайдов [74]:
$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'
3v4l.org/Ln9g3 [75]
В тему хороший ресурс по обновлению и поддержке легаси кода: understandlegacycode.com [76].
Сегодня будет четвертый стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и интересными деталями, не вошедшими в текстовый выпуск. В гостях Антон Титов с рассказом про новый инструмент. А также результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра [78] или телеграм [79].
Больше новостей и комментариев в Telegram-канале PHP Digest [80].
Прислать ссылку [81]
Поиск ссылок по всем дайджестам [82]
← Предыдущий выпуск: PHP-Дайджест № 196 [83]
Автор: Роман Пронский
Источник [84]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/360993
Ссылки в тексте:
[1] PHP Дайджест Live: #digest-live
[2] PHP Russia переносится на 28 июня 2021 года.: https://phprussia.ru/moscow/2020/articles/1501
[3] Итоги года в PHP мире: https://skyeng-school.typeform.com/to/iNfIjQbr
[4] [RFC] Object keys in arrays: https://wiki.php.net/rfc/object_keys_in_arrays
[5] RFC Enumerations: https://wiki.php.net/rfc/enumerations
[6] [RFC] Object scoped RNG Implementations: https://wiki.php.net/rfc/object_scope_prng
[7] random_bytes(): https://www.php.net/manual/ru/function.random-bytes.php
[8] random_int(): https://www.php.net/manual/ru/function.random-int.php
[9] [RFC] var_representation(): readable alternative to var_export(): https://wiki.php.net/rfc/readable_var_representation
[10] был RFC: https://wiki.php.net/rfc/var-export-array-syntax
[11] brick/varexporter: https://github.com/brick/varexporter
[12] [RFC] Change Default mysqli Error Mode: https://wiki.php.net/rfc/mysqli_default_errmode
[13] инициативы: https://wiki.php.net/rfc/improve_mysqli
[14] PHPLive#3: https://www.youtube.com/watch?v=DEV3K_Tf5Do&t=276s
[15] [RFC] Dump results of expressions in `php -a`: https://wiki.php.net/rfc/readline_interactive_shell_result_function#changelog
[16] PHP 8.1: What's New and Changed: https://php.watch/versions/8.1
[17] fabpot/local-php-security-checker: https://github.com/fabpot/local-php-security-checker
[18] FriendsOfPHP/security-advisories: https://github.com/FriendsOfPHP/security-advisories
[19] GitHub action: https://github.com/marketplace/actions/php-security-checker
[20] Docker-образы: https://hub.docker.com/repository/docker/oxcom/php-security-checker
[21] oxcom: https://habr.com/ru/users/oxcom/
[22] funivan/PhpClean: https://github.com/funivan/PhpClean
[23] Отличный пост: https://funivan.com/post/phpclean-intro/
[24] wasmerio/wasmer-php: https://github.com/wasmerio/wasmer-php
[25] в посте: https://mnt.io/2019/04/03/%f0%9f%90%98%f0%9f%a6%80%f0%9f%95%b8-php-ext-wasm-migrating-from-wasmi-to-wasmer/
[26] temporalio/sdk-php: https://github.com/temporalio/sdk-php
[27] temporal.io: https://temporal.io/
[28] RoadRunner: https://github.com/spiral/roadrunner
[29] reactphp/promise: https://github.com/reactphp/promise
[30] атрибуты PHP 8: https://github.com/spiral/attributes
[31] chaos-php/chaos-monkey-symfony-bundle: https://github.com/chaos-php/chaos-monkey-symfony-bundle
[32] Chaos Monkey: https://github.com/Netflix/chaosmonkey
[33] Новое в Symfony: инициатива UX — новая экосистема JavaScript для Symfony: https://habr.com/ru/company/otus/blog/538094/
[34] Новое в Symfony 5.2: атрибуты PHP 8: https://habr.com/ru/company/otus/blog/538482/
[35] Неделя Symfony #734 (18-24 июня 2021): https://symfony.com/blog/a-week-of-symfony-734-18-24-january-2021?utm_medium=feed
[36] umbrellio/laravel-pg-extensions: https://github.com/umbrellio/laravel-pg-extensions
[37] Расширяем возможности миграций Laravel за счет Postgres: https://habr.com/ru/post/537426/
[38] fico7489/laravel-eloquent-join: https://github.com/fico7489/laravel-eloquent-join
[39] artisan.page: https://artisan.page/
[40] Мульдоменное / multitenant приложение на Laravel и Jetstream: https://www.youtube.com/watch?v=5CjWPU7lns4
[41] Непрерывная интеграция для Laravel с помощью Github Actions: https://laravel.demiart.ru/continuous-integration-github-actions/
[42] 18 советов по оптимизации запросов к базе данных: https://laravel.demiart.ru/laravel-database-queries-optimization/
[43] Laravel–Дайджест (18–24 января 2021): https://habr.com/ru/post/538902/
[44] yiisoft/i18n 1.0: https://github.com/yiisoft/i18n
[45] yiisoft/auth 3.0: https://github.com/yiisoft/auth
[46] walkor/Workerman: https://github.com/walkor/Workerman
[47] the-benchmarker/web-frameworks: https://github.com/the-benchmarker/web-frameworks
[48] walkor/phpsocket.io: https://github.com/walkor/phpsocket.io
[49] chubbyphp/chubbyphp-workerman-request-handler: https://github.com/chubbyphp/chubbyphp-workerman-request-handler
[50] gotzmann/comet: https://github.com/gotzmann/comet
[51] Коллизии PHP массивов: https://sorin.live/colliding-php-arrays/
[52] в 2011 году уже писал: https://nikic.github.io/2011/12/28/Supercolliding-a-PHP-array.html
[53] php.watch: PHP Curl Security Hardening: https://php.watch/articles/php-curl-security-hardening
[54] Пишем Telegram-бота на PHP: https://pretzelhands.com/posts/build-a-telegram-bot-in-php
[55] beyondcode/expose: https://github.com/beyondcode/expose
[56] Делаем динамический профиль на GitHub: https://hackernoon.com/how-to-build-a-dynamic-github-profile-with-github-actions-and-php-h5g34cr
[57] Двоичные и побитовые операции в PHP: https://habr.com/ru/company/mailru/blog/538052/
[58] Трассировка и логирование в микросервисах: https://habr.com/ru/company/skyeng/blog/531858/
[59] Интеграция PHP проекта на GitHub и Scrutinizer: https://habr.com/ru/post/537088/
[60] Автоматизация ручных действий с GitHub Actions: https://habr.com/ru/post/537014/
[61] Xdebug 3: Diagnostics: https://www.youtube.com/watch?v=IN6ihpJSFDw
[62] Как использовать терминал в PhpStorm: https://www.youtube.com/watch?v=h1sGfV5i_kI
[63] Mastering PhpStorm: https://masteringphpstorm.com
[64] Live-coding a Bref Queue: https://www.youtube.com/watch?v=tVsnbvCd6Wg
[65] Bref: https://github.com/brefphp/bref
[66] PHP Release Radar #2: PHP 8: https://www.youtube.com/watch?v=piFQSkVU3mw
[67] Это не легаси-код, это PHP: https://habr.com/ru/company/vdsina/blog/537034/
[68] Буря в стакане по поводу PHP 8: https://stitcher.io/blog/a-storm-in-a-glass-of-water
[69] пост: https://24daysindecember.net/2020/12/21/a-perfect-storm/
[70] @jrf_nl: https://twitter.com/jrf_nl
[71] иногда: https://externals.io/message/112909#112910
[72] 3v4l.org/pU0LD: https://3v4l.org/pU0LD
[73] задокументированный: https://www.php.net/manual/ru/function.substr.php#refsect1-function.substr-changelog
[74] из слайдов: https://speakerdeck.com/jrf/php-8-and-legacy-code?slide=6
[75] 3v4l.org/Ln9g3: https://3v4l.org/Ln9g3
[76] understandlegacycode.com: https://understandlegacycode.com
[77] Как выглядел бы PHP, если бы это зависело от меня: https://stitcher.io/blog/php-reimagined
[78] личку хабра: https://habrahabr.ru/conversations/pronskiy/
[79] телеграм: https://t.me/pronskiy
[80] PHP Digest: https://t.me/phpdigest
[81] Прислать ссылку: https://bit.ly/php-digest-add-link
[82] Поиск ссылок по всем дайджестам: https://pronskiy.com/php-digest/
[83] Предыдущий выпуск: PHP-Дайджест № 196: https://habr.com/ru/post/536726/
[84] Источник: https://habr.com/ru/post/539034/?utm_source=habrahabr&utm_medium=rss&utm_campaign=539034
Нажмите здесь для печати.