Пых
8.36K subscribers
212 photos
12 videos
6 files
528 links
Блог @vudaltsov о разработке на PHP.

Хобот: @phpyhobot
YouTube: https://youtube.com/@phpyh
VK Видео: https://vkvideo.ru/@phpyh
Мемы: https://t.me/isPHPdying
Статистика: https://t.me/INOTAROBOT?start=st1219340804

Вакансии НЕ размещаются.
Download Telegram
Ищем спикеров для четвёртого Пыхапа × Lamoda Tech в июне

Ориентировочные темы докладов:
• статический анализ в PHP, сравнение с другими языками,
• Rector и плагины,
• проектирование и документация API,
• телеметрия и мониторинг,
• организация кода (Vertical Slice Architecture, coupling/cohesion),
• альтернативные рантаймы (RoadRunner, FrankenPHP, ngx-php),
• CI/CD пайплайны для PHP.

Подать заявку: https://forms.gle/KCggoZFFTZcwoNqq8
_______________

Мы выложили плейлист с докладами последнего Пыхапа: YouTube, VK Видео.
🔥27👍166😢1
Всем, привет! С прошлыми майскими праздниками, и с будущими тоже! 🎉

Во всех PHP сообществах наступила тишина, или все отдыхают, или усердно работают 😄
Так или иначе, под шумок апрельских и майских деньков ворвался и был одобрен RFC по добавлению новых функций для работы с массивами: array_first() и array_last() в PHP 8.5.

Как видно из названий, это функции для получения первого и последнего значения передаваемого массива. Примеры результатов:

array_first([1, 2, 3]); // 1
array_first([2, 3]); // 2
array_first(['a' => 2, 'b' => 1]); // 2
array_first([null, 2, 3]); // null
array_first([]); // null
array_first([$obj, 2, 3]); // $obj
array_first([1])); // 1
array_first([true]); // true

array_last([1, 2, 3]); // 3
array_last([2, 3]); // 3
array_last(['a' => 2, 'b' => 1]); // 1
array_last([2, 3, null]); // null
array_last([]); // null
array_last([2, 3, $obj]); // $obj
array_last([1])); // 1
array_last([true]); // true


И тут возможно возникнет вопрос? Что? Это было добавлено только что, неужели ранее подобных функций не было в PHP, языке в котором есть почти все что угодно для работы с массивами.
И действительно только что. Достаточно вспомнить, что массив в PHP - это монструозный комбайн всего, что только можно придумать. Соответственно метод "влоб" - получения элемента по нулевому индексу, не всегда даст ожидаемый результат:

$array = [
"g" => 456,
2,
4 => "string"
];

var_dump($array[0]); //выдаст 2
[$first] = $array; // какая-нибудь деструктуризация выдаст тоже 2


Заглянем в недалекое прошлое, в 2018 год, PHP 7.3, в то время были приняты такие функции как array_key_first() и array_key_last().

Но возможно для кого-то будет новостью, что в том же RFC предлагалось ввести так же такие функции как array_value_first() и array_value_last(), что логично возвращали бы значения первого и последнего элемента в массиве. Но эти функции были отклоненны, почему, не совсем понятно, может кто-то из подписчиков помнит и знает доподлинную причину отклонения, либо просто время не пришло, и нужны были дополнительные 7 лет для переосознания 😀

Так вот с тех пор получать ключи стало проще, нежели ранешнее array_keys($array)[0], а если еще массив был пустым, то обязательная проверка на пустоту или вообще увеличение когнитивной сложности реализации в виде циклов (что-то достаточно приближенно к современному программированию на каком-нибудь golang).

Получение первого и последнего элементов массива тоже стало проще:

var_dump($array[array_key_first($array)]);  // 456
var_dump($array[array_key_last($array)]); // "string"


А что было до PHP 7.3? Кроме указанного способа по получению ключей, а затем значений, еще с PHP 4, были функции reset() и end(). Были, есть и будут :) И используя их можно получить вполне ожидаемый результат:

var_dump(reset($array));  //456
var_dump(end($array));exit; // "string"

// или те же array_shift, array_pop тоже технически выполнят что нужно

var_dump(array_shift($array)); //456
var_dump(array_pop($array)); // "string"


так зачем тогда все эти телодвижения по вводу новых функций?

Просто все существующие хитрости,семантически являются неправильным подходом, поскольку они изменяют внутреннее состояние массива. Кроме того, это также не работает должным образом для, например, массива, возвращаемого из функции или других подобных непредусмотренных случаев.

А как вы думаете, нужны ли были эти новые функции или итак по старинке справились бы?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍100🔥2011
Пых
Друзья, я долго вынашивал этот план. Заручился поддержкой трёх родных ивент-компаний и сегодня принял окончательное решение: В сентябре у нас будет Пых.Конф! Подробности чуть позже.
Сегодня забронировал площадку.

Пых.Конф пройдёт 19 сентября в Центре Международной Торговли.

Вскоре после майских будет сайт, билеты по стартовой цене и форма подачи доклада.
👍56🔥41👏11🦄2👀1
Пых
Ищем спикеров для четвёртого Пыхапа × Lamoda Tech в июне Ориентировочные темы докладов: • статический анализ в PHP, сравнение с другими языками, • Rector и плагины, • проектирование и документация API, • телеметрия и мониторинг, • организация кода (Vertical…
Идея доклада для четвёртого Пыхапа × Lamoda Tech

Сегодня многие компании, исконно писавшие на PHP, зачем-то переходят на Go. Зачастую пыхари вынуждены перестраиваться на лету, и нам было бы очень интересно послушать про этот опыт.

Какие технические преимущества лично тебе дал новый язык (эффективное управление памятью, горутины, не нужен pgbouncer/amqproxy)? Где поджидали разочарования (нет как таковых фреймворков, не принято юзать ORM)? Что было непривычным и как проходил твой "paradigm shift"?

Если ты уверенно кодишь и на PHP, и на Go и готов к середине июня подготовить такой доклад, напиши мне в личку.
🔥33👍28
FrankenPHP переходит под крыло PHP!

https://externals.io/message/127347

The PHP Foundation would like to announce that it has decided to directly support the FrankenPHP project moving forward. The plan is that FrankenPHP will move to the PHP GitHub organization, which will make it easier for core contributors and others to be actively involved in the project. A portion of its documentation will also move to php.net (exact details TBD).

This change will put FrankenPHP in essentially the same administrative "bucket" as PECL extensions. Its governance will not change; the same maintainers will still be maintaining it, but it will now be easier for others to contribute to the project and coordinate larger efforts.

At this time, there are no plans for tighter integration into php-src the way PHP-FPM or the CLI SAPI are. Should there be serious discussion of that in the future, it will involve an RFC, just like any other major addition to php-src.


Кратко:
Репозиторий FrankenPHP в ближайшее время переедет в организацию PHP на GitHub.
• Мейнтейнеры останутся теми же (Kévin Dunglas).
• В будущем сервер может войти в состав PHP по аналогии с PHP-FPM, если такой RFC пройдёт голосование.

Вот такие дела, RoadRunner...
🔥94👍26🤔21👏1😁1💩1
Большое обновление Хобота!

Вы давно меня просили воскресить Бусти. Но я в первую очередь программист, а не предприниматель, поэтому я решаю задачи не эффективно, а так, чтобы пописать код. 😅

Короче, теперь в Хоботе можно приобрести мои лекции. Одна уже есть, две в процессе. Надеюсь, собственная технология распространения материалов замотивирует меня их побольше создавать...

Бот написан на AMPHP с использованием их HTTP сервера, HTTP клиента и драйвера для Postgres. Ещё бот стал экспериментальной площадкой для новых компонентов Thesis. Другие подробности вы можете узнать у него самого!

В будущем я планирую научить Хобота помогать мне с менторингом, регистрировать на Пыхап и даже предоставлять доступ к курсам. Главное, что уже есть модуль биллинга.

Буду рад замечаниям и предложениям по улучшению UX.

@phpyhobot

MessageBus: от сервисов к обработчикам

Первая доступная для покупки лекция — та самая, про MessageBus. Это двухчасовой монтаж стрима, который я проводил в апреле для участников слонового краудфандинга (кстати, пора мне узнать, как там дела на фабрике).

Рекомендую её всем, кому интересна message-driven архитектура, CQRS, проектирование пайплайнов с middleware, устройство компонентов а-ля symfony/messenger и, конечно, дженерики. Подробное описание лекции в Хоботе.

@phpyhobot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥16👏5👎3🥰1
Пых
Так-с, есть ошибка. Чиню! 🤔
Работает! Два момента исправил:

• телеграмовский userId в Postgres надо хранить в bigint (забавно, что у всех вчерашних бета-тестеров id были меньше),

• не учитывалась блокировка бота пользователями (тут пока хотфикс, позже сделаю по-нормальному).

@phpyhobot
👍24😁9🔥51
Как проводить и проходить собеседования в 2025

Дмитрий Алин, автор канала @live_php_news и организатор питерских митапов, поделился своим опытом поиска работы:

https://telegra.ph/Kak-provodit-i-prohodit-sobesedovaniya-05-25

Я сам уже более двух лет никуда не собесился, поэтому очень интересно наблюдать, как это происходит сегодня, в эпоху "умного поиска" со стороны спроса и волчистости со стороны предложения.

Расскажите в комментариях, с чем вы столкнулись при поиске работы и что вам помогло.
🤮55👍26🔥6
Принимаем заявки на доклады!

19 сентября в Москве в Конгресс-центре ЦМТ пройдёт новая PHP-конференция для всех.

👥 400 участников • 🔢 4 зала • 🎙 28 докладов

Скоро откроется сайт конференции, где можно будет приобрести билет по стартовой цене.

А пока — подай доклад! Спикер участвует бесплатно, готовится вместе с программным комитетом и получает ценный опыт публичных выступлений.

Ориентировочный список тем:
• async и неблокирующий I/O;
• статический анализ: Psalm, PHPStan, Rector;
• производительность и highload;
• архитектура: ES, DDD, CQRS, микросервисы;
• тестирование и бенчмаркинг;
• инфраструктура: очереди, стримы, базы данных;
• DevOps: CI/CD, Docker, Kubernetes;
• AI/ML;
• фреймворки: Yii, Symfony, Laravel;
• CMS: WordPress, Drupal, Bitrix;
• IDE и плагины;
• open source: опыт, ошибки, лучшие практики.

Заявку, а лучше несколько, можно подать через Хобота до 1 июля. Мы свяжемся с тобой в течение недели и дадим обратную связь.

До встречи на Пых.конф’25!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍115🤡4
RFC Pipe operator принят, заглянем в будущее!

https://wiki.php.net/rfc/pipe-operator-v3

Команда Typhoon, в особенности Андрей Клименко, очень внимательно следила за этим RFC. Недавно о нём писали фартаны, теперь RFC принят, и я хочу разрешить ваш скепсис.

Вот вам реальный сниппет из исходников Хобота, который формирует и отправляет запрос в Т-Банк:


$normalizedMessage = $this->normalizer->normalize($message);
$requestData = $this->prepareRequestData($normalizedMessage);
$request = $this->buildRequest($endpoint, $requestData);
$response = $this->httpClient->request($request);
$responseBody = $response->getBody();

// Тут дальше логирование, проверка статус-кода и денормализация.


В целом, ок. Но хорошо было бы избавиться от промежуточных присваиваний, не вкладывая при этом вызовы друг в друга, чтобы не пострадала читабельность. Спасибо Ларри, в ноябре можно будет отрефакторить так:


$responseBody =
$this->normalizer->normalize($message)
|> $this->prepareRequestData(...)
|> fn (array $data): Request => $this->buildRequest($endpoint, $data)
|> $this->httpClient->request(...)
|> fn (Response $response) => $response->getBody()
;


Стало лучше? Спорно. Но этот RFC — лишь первый шаг Ларри в сторону реально крутых пайпов. Нам нужно изучить Future Scope, чтобы понять весь замысел.

Помечтаем. Ноябрь 2026, и я рефакторю код уже вот так:


$responseBody =
$this->normalizer->normalize($message)
|> $this->prepareRequestData(...)
|> $this->buildRequest($endpoint, ?)
|> $this->httpClient->request(...)
|> $$->getBody()
;


Теперь действительно выглядит круто. Разберёмся, что тут происходит.

? — это partial function application, как first class callable syntax (...), но с возможностью передать (применить) часть аргументов и выбрать вопросами параметры для результирующей функции:


$this->buildRequest($endpoint, ?)
// дешугарится в
fn (array $data): Request => $this->buildRequest($endpoint, $data)


Кстати, для PFA Ларри уже делал RFC 5 лет назад. Но тогда возникли трудности с реализацией и Никита Попов предложил (...) в качестве более простой альтернативы. Теперь же потребность в ? сильно возросла и, я уверен, будет найдено решение.

$$ — это, грубо говоря, "object application":


$$->getBody()
// дешугарится в
static fn ($object) => $object->getBody()


Этот RFC — большой шаг для развития функционального стиля в PHP. Уже сейчас проекты fp4php и Crell/fp начинают играть новыми красками, а с ? и $$ будет вообще кайф.
_______

Пссс, сегодня в 16:00 19:30 на канале Пых.конф’25 появится конкурс, приз — бесплатный билет на конференцию. Подписывайся, чтобы не пропустить!
🤮116👍27🔥20🤔12🥴75
Пых
RFC Pipe operator принят, заглянем в будущее! https://wiki.php.net/rfc/pipe-operator-v3 Команда Typhoon, в особенности Андрей Клименко, очень внимательно следила за этим RFC. Недавно о нём писали фартаны, теперь RFC принят, и я хочу разрешить ваш скепсис.…
К сожалению, на подготовку условия задачи и настройку Хобота на приём ответов потребовалось больше времени, чем мы ожидали. Поэтому мы переносим конкурс на 19:30 — приезжайте домой с работы, подписывайтесь на Пых.конф’25 и будьте готовы!
👌8🐳1🗿1
Live stream scheduled for
Итак, по итогам разбора решений победила @marfo4ka!
Поздравляем Марию — она обладатель первого билета на Пых.конф’25! 🎉

Решение задачи.

Этот конкурс — лишь начало, подписывайтесь на канал Пых.конф’25, чтобы ничего не пропустить.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍7🎉31😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
😱51🤔42🔥76👀4👍3🙏1
Уточнение требований к платформе на уровне пакета

Представьте, что вы пишете библиотеку под PHP, которая будет правильно работать только в 64-разрядных системах. Например, vjik/telegram-bot-api использует тип int для идентификатора чата, а chat.id, согласно документации, может иметь до 52 значимых бит.

Как предотвратить установку такого пакета на 32-разрядной системе? Через Composer! В composer.json можно указать соответствующий суффикс для php:


{
"require": {
"php-64bit": "^8.4"
}
}


Другие поддерживаемые подтипы php:
php-ipv6 — сборка PHP с поддержкой IPv6 (без флага --disable-ipv6),
php-zts — потокобезопасная сборка PHP (с флагом --enable-zts),
php-debug — сборка PHP в режиме отладки (с флагом --enable-debug).

Чтобы скомбинировать несколько таких требований, не дублируя при этом констрейнт, можно поступить как с Core-расширениями:


{
"require": {
"php-64bit": "^8.4",
"php-ipv6": "*"
}
}


Вообще, всё это есть в документации Composer, но я случайно узнал на днях, изучая пакет danog/telegram-entities.

P.S.: Закинул PR Сергею.
2👍83🔥1911👀3😱2
Пыхап #4 × Lamoda Tech / 19 июня 2025

Ровно через 2 недели состоится четвёртый Пыхап! В программе 3 крутых доклада и новый формат — факап-разгоны!

👁 Observability в PHP без боли
Олег Мифле из Altenar научит держать руку на пульсе прода при помощи логов, метрик и трейсинга.

🎲 Абьюзим random_bytes()
Фёдор Кулаков из Lamoda проведёт в недра PHP, чтобы показать, как за минуту получить одинаковые "рандомные" значения.

📤 Кто отправит outbox?
Валентин Удальцов покажет, как эффективно отправлять сообщения, сохранённые вместе со стейтом.

🤣 Факап-разгоны
Опробуем новый формат от Lamoda Tech! 4 эксперта на сцене сначала обсудят свои факапы, а затем поразгоняют кейсы из Хобота, зала и чата трансляции. Путём голосования определим 3 победителей, которые получат бесплатные билеты на Пых.конф’25 или слоника Пых.

🍕 Афтепати и игры
После митапа можно будет остаться поболтать за пиццей.

📍 Пыхап пройдёт 19 июня в 19:10 (четверг) в офисе Lamoda (ул. Крылатская, 15). Вход бесплатный! Регистрация откроется завтра в 15:00 МСК на канале Пых.

📹 Как обычно, будет трансляция на YouTube и VK Видео с записью!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥56👍2816🥱1
Пых
Пыхап #4 × Lamoda Tech / 19 июня 2025 Ровно через 2 недели состоится четвёртый Пыхап! В программе 3 крутых доклада и новый формат — факап-разгоны! 👁 Observability в PHP без боли Олег Мифле из Altenar научит держать руку на пульсе прода при помощи логов,…
Открыта регистрация на Пыхап #4 × Lamoda Tech

В конце следующей недели пройдёт четвёртый Пыхап. В программе 3 доклада, факап-разгоны и афтепати!

🗓 19 июня в 19:10 (четверг)

📍 Офис Lamoda на ул. Крылатская, 15

🆓 Офлайн и онлайн участие бесплатное!

✏️ Регистрация через Хобота
Please open Telegram to view this post
VIEW IN TELEGRAM
👍137🔥4