Пых
8.34K subscribers
259 photos
14 videos
6 files
563 links
Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://t.iss.one/isPHPdying

Статистика: https://t.iss.one/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
Typhoon учится выводить дженерики

Всю неделю контрибьютил в алгебру типов Typhoon (пока в приватном репо), в частности научился программно решать системы линейных уравнений над типами.

На скриншоте вы видите, как алгебра выводит результат вызова полиморфной функции а-ля array_combine. Причём делает это с анонимной сигнатурой буквально "на весу".

Аналогичный код в PHPStan (выводит верно, но с нерелевантными ошибками) и Scala.

Дальше больше...

Примечание: PHPDoc просто для понимания описываемой сигнатуры, он никак не парсится алгеброй.
🔥30👍15🥴84❤‍🔥2🤯2😱21
Два простых правила

Вот сколько лет я ни пишу код, без конца убеждаюсь в двух вещах:

1. Если стоит выбор между мутабельностью и иммутабельностью — без раздумий выбирай иммутабельность.
2. Если стоит выбор между наследованием и композицией — без раздумий выбирай композицию.

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

Каждый раз, когда я выбираю наследование, я получаю запутанный код, который трудно переиспользовать (хотя обещали, что будет наоборот) и невозможно читать, не прыгая по нескольки классам с полузащищённым API.

Интересно, что и мутабельность, и наследование осложняют типизацию и привносят костыли: @self-out, @this-out, @require-extends.

Я не Егор Бугаенко и не утверждаю, что мутабельность и наследование прям вот совсем не нужны. Но если есть выбор (90% случаев на моей open source практике) — советую воздерживаться.
💯91👍42🔥11🤔74🫡3
9 полезных плагинов

В блоге JetBrains вышел обзор плагинов Димы Дерепко:

.​gitattributes support
Git Codeowners
Cron / Crontab Support
Sitemap Support
TempestPHP (поддержка фреймворка автора канала PHP Annotated)
🪲 Buggregator
PHP Dump (показывает опкоды и AST)
FileSystem Info (выводит информацию по папкам и файлам: кол-во файлов, размер, LOC)
Git Churn (анализирует частоту изменений файлов в Git)

https://blog.jetbrains.com/phpstorm/2025/11/phpstorm-plugins-you-might-not-know/

P.S. Мне Дима тоже периодически предлагает сделать что-то полезное для моих проектов. И у меня уже есть идея!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40🔥189😴5
Ищу напарника на стрим по Typhoon

На следующей неделе хочу провести Typhoon-стрим. Мы наконец-то напишем простой инструмент на базе typhoon/type, который будет полезен в самых обыкновенных проектах.

Чтобы было веселее писать код, приглашаю любого из вас присоединиться в роли второго пилота. Нужно быть в теме статического анализа в PHP, оценивать свой уровень на middle+ и не бояться говорить на камеру в прямом эфире.

Желающие, скидывайте в личные сообщения канала Пых свой GitHub.
👍14🔥135😁1
Убираем null?

В конце месяца совместно с Garage Eight и Live PHP делаем митап в Санкт-Петербурге. Регистрация откроется через неделю.

В числе спикеров отчаянный борец против nullВладимир Романичев.

Вчера мы прогоняли его доклад, а сегодня я кидаю вам пример рефакторинга своего кода...

Было

final class Context
{
/**
* @var array<non-empty-lowercase-string, Name>
*/
private array $uses = [];

public function __construct(
public readonly ?Name $namespace = null,
) {}

public function use(Name $name, ?Name $as = null): self
{
$context = clone $this;
$context->uses[($as ?? $name->last())->toLowercaseString()] = $name;

return $context;
}
}


Стало

final class Context
{
// ...

public function use(Name $name): self
{
return $this->useAs($name, $name->last());
}

public function useAs(Name $name, Name $as): self
{
$context = clone $this;
$context->uses[$as->toLowercaseString()] = $name;

return $context;
}
}


Я не считаю null абсолютным злом, тем более, что в PHP он явный, но иногда действительно можно сделать красивее без него.
👍36🥴3413🔥12👎5🤔5🤡4
Garage Eight × LivePHP × Пыхап в Санкт-Петербурге

В следующий четверг в 18:30 мы совместно с Garage Eight и Live PHP делаем митап в офисе "гаражей".

В программе:
💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.

🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.

🧠 Архитектура ИИ-сервиса для распознавания документов
Михаил Мироненко покажет путь от MVP до продакшена.

✌️ Офлайн-гостей ждут угощения и экскурсия по офису Garage Eight с панорамным видом на город. Плойка и кикер также к вашим услугам!

📍 Митап пройдёт 27 ноября в 18:30 в питерском офисе Garage Eight. Вход бесплатный, но нужно зарегистрироваться.

📹 Как обычно, будет трансляция на YouTube и VK Видео с записью!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥188
Только что на php.net опубликовали PHP 8.5!

Тег уже два дня как стоит, но я ждал финального аккорда.

По этому поводу держите мой доклад со Стачки «PHP 8.5 не сбавляет темп!». Из него вы узнаете про основные фичи новой версии и нюансы их применения.

Основные таймкоды:
01:04 Все способы получения первого элемента массива в PHP (в т. ч. бредовые)
05:20 Pipe operator v3
10:56 URL Api
17:20 Clone with v2
21:24 #[NoDiscard]
24:07 Closure и FCC в константных выражениях
27:57 Persistent cURL handles
29:33 Асимметричная видимость статических свойств
30:00 Рекурсивные замыкания
37:41 Типизируем array_first()

https://youtu.be/OIFbU5oypig
https://vkvideo.ru/video-228746873_456239122
https://vudaltsov.github.io/php8.5-slides
https://php.net/releases/8.5/ru.php
4🔥70👍253
Когда проекты растут, а требований становится больше, скорость разработки начинает упираться не в язык или фреймворки, а в процессы, инструменты и организацию работы.

С 1 по 5 декабря сезон Podlodka PHP Crew о том, как разгонять PHP-разработку без стресса и перегрузов.

Все темы прикладные, с упором на ускорение команд и уменьшение рутины:

📄 Контракты пишем — код генерим Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.

⚙️ Background-агенты в разработке — Пётр Мязин («Пятиминутка PHP») покажет, как построить процесс вокруг ИИ-инструментов.

🧩 Тесты для ускорения Александр Макаров (Twindo): о роли тестирования в скорости разработки и как распределить ответственность между разработчиками, QA и LLM.

🚦 Светофоры для разработчиков — Ярослав Тарасов (Skyeng) расскажет, как ускорить обратную связь от коммита до продакшена.

🔥 Баланс фич и техдолга — Дмитрий Кириллов поделится холиварным кейсом «100% фичи, 0% техдолг».

🤖 От промпта к продакшену — Павел Бучнев (Spiral Scout, 🔥) объяснит, почему пора мыслить контекстами, а не только промптами.

Программа и билеты: https://podlodka.io/phpcrew

По промокоду phpyh7 скидка 500р!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥176👍5👌1
Абсракция — текущая абстракция.

#пыхослов
1😁58💩15🤣93👍3🤯3👎2
Напоминаю, что завтра в 18:30 мы встречаемся на совместном митапе Garage Eight × LivePHP × Пыхап!

🏢 Ждём офлайн в Санкт-Петербурге в офисе Garage Eight по адресу Новгородская, 17, Бизнес-центр М22. Вход с Кирочной улицы, мы будем вас встречать внутри. Паспорт не нужен, только регистрация. Передать место другу можно через @airkatie.

🖥 Ждём онлайн в YouTube и VK Видео. Кстати, в онлайне тоже можно будет выиграть приз за лучший вопрос!

🙅🏻‍♀️ Если передумал(-а) или по какой-либо причине не сможешь прийти, пожалуйста, сообщи об этом @airkatie.

До встречи на митапе!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍13🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
👍24🔥1311
Garage Eight × LivePHP × Пыхап в Санкт-Петербурге

Мы в эфире!

💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.

🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.

🧠 Архитектура ИИ-сервиса для распознавания документов
Михаил Мироненко покажет путь от MVP до продакшена.

Залетай в YouTube и VK Видео!
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥19👍92
-export-ignore в .gitattributes

Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -.

Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем только важные для распространения пакета файлы:


* export-ignore
/src/ -export-ignore
/src/** -export-ignore
/composer.json -export-ignore
/README.md -export-ignore
/CHANGELOG.md -export-ignore
/LICENSE -export-ignore


📁Параграф в документации gitattributes
📁PR в Composer, который добавил поддержку -export-ignore аж в 2021

Исправлено 10 декабря: добавил правило /src/** -export-ignore, см. пост.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍366🔥5
Пых
-export-ignore в .gitattributes Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -. Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем…
Выяснилось, что /src/ -export-ignore разыгноривает только саму директорию src. Для файлов надо ещё добавить правило /src/** -export-ignore.

В документации к gitattributes это есть (RTFM):

The rules by which the pattern matches paths are the same as in .gitignore files, with a few exceptions:
- negative patterns are forbidden
- patterns that match a directory do not recursively match paths inside that directory (so using the trailing-slash path/ syntax is pointless in an attributes file; use path/** instead)


Итоговый рабочий вариант (проверено при помощи git archive с директориями и файлами разной вложенности):


* export-ignore
/src/ -export-ignore
+/src/** -export-ignore
/composer.json -export-ignore
/README.md -export-ignore
/CHANGELOG.md -export-ignore
/LICENSE -export-ignore


Закинул исправляющий PR в yii-soft/package-template.
👍259🔥1
Hello, my name is Human

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

Недавно на одном созвоне прозвучало обобщение в духе "да сейчас все через ИИ генерят посты". Хуй там плавал — я пишу сам, иначе для меня в этом не было бы никакого смысла.

Конечно, я могу перепроверить какой-то факт при помощи чатика, но в этом случае я его использую исключительно как альтернативу поиску. Я никогда не прошу сформулировать мысль или поправить стилистику. Мне важно, что идея, которую я придумал, облечена в форму, которую я сам создал. Для меня в этом состоит суть авторства и самовыражения.

Как же тупо, что теперь об этом надо как-то специально уведомлять. В идеале это должно подразумеваться. Но вот такие сегодня всратые реалии...

Кстати, длинные тире я ставлю примерно с тех пор, как прошёл пунктуацию в школе. Например, второй пост на канале от 6 апреля 2019 содержит длинное тире. На маке это делается одним сочетанием: Shift + ⌥ + -.
52👍6222🔥16🍌2👏1🥱1
🐘 PHPeople

Ребята, мы с Данилом с CutCode запускаем новый проект для PHP-сообщества!

🧩 Проблема

С одной стороны, в сообществе есть куча крутых ребят, готовых делиться опытом, обозревать тулинг и контрибьютить в экосистему PHP. Но без материального поощрения на это трудно выделить время и силы. Условный Boosty обходится дорого, а страницу там ещё как-то надо продвигать.

С другой стороны, есть вы — аудитория, которой в 2024 не хватило онлайн-контента. И вы наверняка готовы поддержать авторов, заплатив разумные деньги за хорошие материалы, которые можно прочитать и обсудить в Телеге, "не отходя от кассы".

💡 Решение

Мы с Данилом разработали платформу по модели подписки на базе Telegram — PHPeople.

Подписка двухуровневая:
1. обязательная на общий чат — "лобное место" для всех участников, тут периодически публикуется часть контента авторов и можно обсуждать вопросы широким кругом;
2. опциональная на любые авторские чаты — собственное пространство каждого автора и его подписчиков.

Стоимость каждой подписки — 150₽. То есть, например, чтобы подписаться только на Дмитрия Дерепко, вам нужно внести 300₽ (общий чат + авторский). На Кирилла Несмеянова и Алексея Гагарина — 450₽ (общий чат + 2 авторских).

👨‍🏫 Авторы

Пока их пятеро:

Кирилл Несмеянов уже набросал всякой хардкорной дичи,
Алексей Гагарин начал писать про разработку Testo — убийцу PHPUnit,
Олег Мифле придумал отрефаторить старый ball of mud на Symfony и микросервисы,
Дима Дерепко расскажет про свои плагины и разработку Language Server.

Я тоже автор. На PHPeople буду проводить закрытые стримы и публиковать посты для Пыха на пару недель раньше. В моём чате уже есть несколько постов про типизацию и нюансы Docker Compose и запись стрима про скаффолдер репозиториев Thesis и Typhoon.

🚀 Давайте пробовать!

Мы провели закрытое бета-тестирование и теперь готовы пригласить всех! Залетайте в @phpeople_bot, там можно подробнее со всем ознакомиться и присоединиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥39👍235👎4🤡4👏2👀2
Forwarded from Erick's Streams
🖥 Библиотека для сбора метрик Prometheus для PHP.

В пояснительной записке к дипломной работе в колледже, а после и в университете, всегда первыми шли «Анализ существующих аналогов» и «Обоснование выбора языка и сред разработки». В учебное время это были смешные пункты, мол, конечно, есть аналоги лучше моего куска, да и обоснование простое — это надо для учёбы.

Но видит бог, на работе я до последнего сопротивлялся тому, чтобы браться писать свой велосипед. Самая популярная 🖥 библиотека имела ряд фатальных недостатков, форки не спасали, а альтернативы находились ещё дальше от того, что было нужно для нашей инфраструктуры. Таким образом вывод был однозначен: нужно писать своё 💀

За основу я взял 🖥 форк вышеупомянутой библиотеки, т.к. её интерфейс и архитектура были наиболее удачными, а в форке уже была проделана часть необходимой работы. Чем больше я рефакторил, тем больше я начинал понимать, почему в крупных компаниях есть практика аудита зависимостей 🙃

Вот вам несколько примеров (24 миллиона установок, кстати):
KEYS для сбора метрик.
base64() поверх json_encode().
EVAL для записи метрик.
SISMEMBER перед SADD.
SCAN для очистки хранилища.
"Тесты" 😂

// Такс, какие они плохие я написал, теперь нужно рассказать о том, какой я молодец

В моём велосипеде:
⭐️ Реализация на двух хешах Redis.
⭐️ Абстрагированная реализация клиента Redis.
⭐️ Сборка метрик в 2 запроса к Redis.
⭐️ Строгая типизация для PHPStan и Psalm.
⭐️ Реальные тесты (пусть их пока и мало).
⭐️ Гораздо более читаемый код (субъективно).

Библиотека успешно внедрена на моём рабочем проекте и в перспективе заменит statsd на Аккаунтах Ely.by.

Так что прошу любить и жаловать:
🖥 GitHub
🖥 Packagist
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥84