Typhoon учится выводить дженерики
Всю неделю контрибьютил в алгебру типов Typhoon (пока в приватном репо), в частности научился программно решать системы линейных уравнений над типами.
На скриншоте вы видите, как алгебра выводит результат вызова полиморфной функции а-ля
Аналогичный код в PHPStan (выводит верно, но с нерелевантными ошибками) и Scala.
Дальше больше...
Примечание: PHPDoc просто для понимания описываемой сигнатуры, он никак не парсится алгеброй.
Всю неделю контрибьютил в алгебру типов Typhoon (пока в приватном репо), в частности научился программно решать системы линейных уравнений над типами.
На скриншоте вы видите, как алгебра выводит результат вызова полиморфной функции а-ля
array_combine. Причём делает это с анонимной сигнатурой буквально "на весу".Аналогичный код в PHPStan (выводит верно, но с нерелевантными ошибками) и Scala.
Дальше больше...
Примечание: PHPDoc просто для понимания описываемой сигнатуры, он никак не парсится алгеброй.
🔥30👍15🥴8⚡4❤🔥2🤯2😱2❤1
Два простых правила
Вот сколько лет я ни пишу код, без конца убеждаюсь в двух вещах:
1. Если стоит выбор между мутабельностью и иммутабельностью — без раздумий выбирай иммутабельность.
2. Если стоит выбор между наследованием и композицией — без раздумий выбирай композицию.
Каждый раз, когда я выбираю мутабельность, я получаю хрупкую программу с непредсказуемыми сайд-эффектами.
Каждый раз, когда я выбираю наследование, я получаю запутанный код, который трудно переиспользовать (хотя обещали, что будет наоборот) и невозможно читать, не прыгая по нескольки классам с полузащищённым API.
Интересно, что и мутабельность, и наследование осложняют типизацию и привносят костыли:
Я не Егор Бугаенко и не утверждаю, что мутабельность и наследование прям вот совсем не нужны. Но если есть выбор (90% случаев на моей open source практике) — советую воздерживаться.
Вот сколько лет я ни пишу код, без конца убеждаюсь в двух вещах:
1. Если стоит выбор между мутабельностью и иммутабельностью — без раздумий выбирай иммутабельность.
2. Если стоит выбор между наследованием и композицией — без раздумий выбирай композицию.
Каждый раз, когда я выбираю мутабельность, я получаю хрупкую программу с непредсказуемыми сайд-эффектами.
Каждый раз, когда я выбираю наследование, я получаю запутанный код, который трудно переиспользовать (хотя обещали, что будет наоборот) и невозможно читать, не прыгая по нескольки классам с полузащищённым API.
Интересно, что и мутабельность, и наследование осложняют типизацию и привносят костыли:
@self-out, @this-out, @require-extends.Я не Егор Бугаенко и не утверждаю, что мутабельность и наследование прям вот совсем не нужны. Но если есть выбор (90% случаев на моей open source практике) — советую воздерживаться.
💯91👍42🔥11🤔7❤4🫡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. Мне Дима тоже периодически предлагает сделать что-то полезное для моих проектов. И у меня уже есть идея!
В блоге JetBrains вышел обзор плагинов Димы Дерепко:
• .gitattributes support
• Git Codeowners
• Cron / Crontab Support
• Sitemap Support
• TempestPHP (поддержка фреймворка автора канала PHP Annotated)
•
• 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🔥18❤9😴5
Ищу напарника на стрим по Typhoon
На следующей неделе хочу провести Typhoon-стрим. Мы наконец-то напишем простой инструмент на базе typhoon/type, который будет полезен в самых обыкновенных проектах.
Чтобы было веселее писать код, приглашаю любого из вас присоединиться в роли второго пилота. Нужно быть в теме статического анализа в PHP, оценивать свой уровень на middle+ и не бояться говорить на камеру в прямом эфире.
Желающие, скидывайте в личные сообщения канала Пых свой GitHub.
На следующей неделе хочу провести Typhoon-стрим. Мы наконец-то напишем простой инструмент на базе typhoon/type, который будет полезен в самых обыкновенных проектах.
Чтобы было веселее писать код, приглашаю любого из вас присоединиться в роли второго пилота. Нужно быть в теме статического анализа в PHP, оценивать свой уровень на middle+ и не бояться говорить на камеру в прямом эфире.
Желающие, скидывайте в личные сообщения канала Пых свой GitHub.
GitHub
GitHub - typhoon-php/type: Typhoon Type System
Typhoon Type System. Contribute to typhoon-php/type development by creating an account on GitHub.
👍14🔥13❤5😁1
Убираем null?
В конце месяца совместно с Garage Eight и Live PHP делаем митап в Санкт-Петербурге. Регистрация откроется через неделю.
В числе спикеров отчаянный борец против
Вчера мы прогоняли его доклад, а сегодня я кидаю вам пример рефакторинга своего кода...
Было
Стало
Я не считаю
В конце месяца совместно с 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🥴34❤13🔥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 Видео с записью!
В следующий четверг в 18:30 мы совместно с Garage Eight и Live PHP делаем митап в офисе "гаражей".
В программе:
После этого доклада от Владимира Романичева разрешается бить морды.
🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.
Михаил Мироненко покажет путь от MVP до продакшена.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥18❤8
Только что на 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
Тег уже два дня как стоит, но я ждал финального аккорда.
По этому поводу держите мой доклад со Стачки «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
YouTube
PHP 8.5 не сбавляет темп! / Валентин Удальцов / Стачка, 3 октября 2025
Слайды: https://vudaltsov.github.io/php8.5-slides/
После насыщенного PHP 8.4 (property hooks, aviz, lazy objects, BCMath\Number) казалось, что должен случиться перерыв...
Но не тут-то было:
- pipe operator,
- clone with,
- aviz для статических свойств,
…
После насыщенного PHP 8.4 (property hooks, aviz, lazy objects, BCMath\Number) казалось, что должен случиться перерыв...
Но не тут-то было:
- pipe operator,
- clone with,
- aviz для статических свойств,
…
4🔥70👍25❤3
Когда проекты растут, а требований становится больше, скорость разработки начинает упираться не в язык или фреймворки, а в процессы, инструменты и организацию работы.
С 1 по 5 декабря сезон Podlodka PHP Crew о том, как разгонять PHP-разработку без стресса и перегрузов.
Все темы прикладные, с упором на ускорение команд и уменьшение рутины:
📄 Контракты пишем — код генерим — Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.
⚙️ Background-агенты в разработке — Пётр Мязин («Пятиминутка PHP») покажет, как построить процесс вокруг ИИ-инструментов.
🧩 Тесты для ускорения — Александр Макаров (Twindo): о роли тестирования в скорости разработки и как распределить ответственность между разработчиками, QA и LLM.
🚦 Светофоры для разработчиков — Ярослав Тарасов (Skyeng) расскажет, как ускорить обратную связь от коммита до продакшена.
🔥 Баланс фич и техдолга — Дмитрий Кириллов поделится холиварным кейсом «100% фичи, 0% техдолг».
🤖 От промпта к продакшену — Павел Бучнев (Spiral Scout,🔥 ) объяснит, почему пора мыслить контекстами, а не только промптами.
Программа и билеты: https://podlodka.io/phpcrew
По промокоду phpyh7 скидка 500р!
С 1 по 5 декабря сезон Podlodka PHP Crew о том, как разгонять PHP-разработку без стресса и перегрузов.
Все темы прикладные, с упором на ускорение команд и уменьшение рутины:
📄 Контракты пишем — код генерим — Александр Забанов (Вебпрактик): contract-first подход, который снижает количество ошибок и делает интеграции предсказуемыми.
⚙️ Background-агенты в разработке — Пётр Мязин («Пятиминутка PHP») покажет, как построить процесс вокруг ИИ-инструментов.
🧩 Тесты для ускорения — Александр Макаров (Twindo): о роли тестирования в скорости разработки и как распределить ответственность между разработчиками, QA и LLM.
🚦 Светофоры для разработчиков — Ярослав Тарасов (Skyeng) расскажет, как ускорить обратную связь от коммита до продакшена.
🔥 Баланс фич и техдолга — Дмитрий Кириллов поделится холиварным кейсом «100% фичи, 0% техдолг».
🤖 От промпта к продакшену — Павел Бучнев (Spiral Scout,
Программа и билеты: https://podlodka.io/phpcrew
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤6👍5👌1
Напоминаю, что завтра в 18:30 мы встречаемся на совместном митапе Garage Eight × LivePHP × Пыхап!
🏢 Ждём офлайн в Санкт-Петербурге в офисе Garage Eight по адресу Новгородская, 17, Бизнес-центр М22. Вход с Кирочной улицы, мы будем вас встречать внутри. Паспорт не нужен, только регистрация. Передать место другу можно через @airkatie.
🖥 Ждём онлайн в YouTube и VK Видео. Кстати, в онлайне тоже можно будет выиграть приз за лучший вопрос!
🙅🏻♀️ Если передумал(-а) или по какой-либо причине не сможешь прийти, пожалуйста, сообщи об этом @airkatie.
До встречи на митапе!
🏢 Ждём офлайн в Санкт-Петербурге в офисе Garage Eight по адресу Новгородская, 17, Бизнес-центр М22. Вход с Кирочной улицы, мы будем вас встречать внутри. Паспорт не нужен, только регистрация. Передать место другу можно через @airkatie.
🙅🏻♀️ Если передумал(-а) или по какой-либо причине не сможешь прийти, пожалуйста, сообщи об этом @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🔥13❤11
Garage Eight × LivePHP × Пыхап в Санкт-Петербурге
Мы в эфире!
💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.
🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.
🧠 Архитектура ИИ-сервиса для распознавания документов
Михаил Мироненко покажет путь от MVP до продакшена.
Залетай в YouTube и VK Видео!
Мы в эфире!
После этого доклада от Владимира Романичева разрешается бить морды.
🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.
Михаил Мироненко покажет путь от MVP до продакшена.
Залетай в YouTube и VK Видео!
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Garage Eight × LivePHP × Пыхап в Санкт-Петербурге / 27 ноября 2025
В следующий четверг в 18:30 мы совместно с Garage Eight и Live PHP делаем митап в офисе "гаражей".
В программе:
💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.
🧬 RabbitMQ: как кворумные очереди окончательно…
В программе:
💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.
🧬 RabbitMQ: как кворумные очереди окончательно…
2🔥19👍9❤2
-export-ignore в .gitattributes
Оказывается, в
Особенно удобно для
📁 Параграф в документации gitattributes
📁 PR в Composer, который добавил поддержку -export-ignore аж в 2021
Исправлено 10 декабря: добавил правило
Оказывается, в
.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
Исправлено 10 декабря: добавил правило
/src/** -export-ignore, см. пост.Please open Telegram to view this post
VIEW IN TELEGRAM
1👍36❤6🔥5
Пых
-export-ignore в .gitattributes Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -. Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем…
Саша Макаров попросил поздравлять его контрибьютами в Yii, поэтому я, вооружившись новым знанием, отправил PR в yiisoft/package-template.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
samdark blog ☕️ (Alexander Makarov)
🎉 Accepting birthday gifts
Tomorrow is my birthday. I'd gladly accept pull request to Yii repositories as a gift. Thanks!
Tomorrow is my birthday. I'd gladly accept pull request to Yii repositories as a gift. Thanks!
🎉77❤18👍14🍾9🤮4👎2
Пых
-export-ignore в .gitattributes Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -. Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем…
Выяснилось, что
В документации к gitattributes это есть (RTFM):
Итоговый рабочий вариант (проверено при помощи
Закинул исправляющий PR в yii-soft/package-template.
/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-slashpath/syntax is pointless in an attributes file; usepath/**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.
👍25❤9🔥1
Hello, my name is Human
Все нерекламные посты на канале Пых написаны лично мной. Так было, так есть и так всегда будет.
Недавно на одном созвоне прозвучало обобщение в духе "да сейчас все через ИИ генерят посты".Хуй там плавал — я пишу сам, иначе для меня в этом не было бы никакого смысла.
Конечно, я могу перепроверить какой-то факт при помощи чатика, но в этом случае я его использую исключительно как альтернативу поиску. Я никогда не прошу сформулировать мысль или поправить стилистику. Мне важно, что идея, которую я придумал, облечена в форму, которую я сам создал. Для меня в этом состоит суть авторства и самовыражения.
Как же тупо, что теперь об этом надо как-то специально уведомлять. В идеале это должно подразумеваться. Но вот такие сегодня всратые реалии...
Кстати, длинные тире я ставлю примерно с тех пор, как прошёл пунктуацию в школе. Например, второй пост на канале от 6 апреля 2019 содержит длинное тире. На маке это делается одним сочетанием:
Все нерекламные посты на канале Пых написаны лично мной. Так было, так есть и так всегда будет.
Недавно на одном созвоне прозвучало обобщение в духе "да сейчас все через ИИ генерят посты".
Конечно, я могу перепроверить какой-то факт при помощи чатика, но в этом случае я его использую исключительно как альтернативу поиску. Я никогда не прошу сформулировать мысль или поправить стилистику. Мне важно, что идея, которую я придумал, облечена в форму, которую я сам создал. Для меня в этом состоит суть авторства и самовыражения.
Как же тупо, что теперь об этом надо как-то специально уведомлять. В идеале это должно подразумеваться. Но вот такие сегодня всратые реалии...
Кстати, длинные тире я ставлю примерно с тех пор, как прошёл пунктуацию в школе. Например, второй пост на канале от 6 апреля 2019 содержит длинное тире. На маке это делается одним сочетанием:
Shift + ⌥ + -.52👍62❤22🔥16🍌2👏1🥱1
Ребята, мы с Данилом с 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👍23❤5👎4🤡4👏2👀2
Forwarded from Erick's Streams
GitHub
GitHub - erickskrauch/prometheus-php: Prometheus metrics collector and exporter for PHP
Prometheus metrics collector and exporter for PHP. Contribute to erickskrauch/prometheus-php development by creating an account on GitHub.
В пояснительной записке к дипломной работе в колледже, а после и в университете, всегда первыми шли «Анализ существующих аналогов» и «Обоснование выбора языка и сред разработки». В учебное время это были смешные пункты, мол, конечно, есть аналоги лучше моего куска, да и обоснование простое — это надо для учёбы.
Но видит бог, на работе я до последнего сопротивлялся тому, чтобы браться писать свой велосипед. Самая популярная
За основу я взял
Вот вам несколько примеров (24 миллиона установок, кстати):
❓
KEYS для сбора метрик.❓
base64() поверх json_encode().❓
EVAL для записи метрик.❓
SISMEMBER перед SADD.❓
SCAN для очистки хранилища.❓"Тесты" 😂
// Такс, какие они плохие я написал, теперь нужно рассказать о том, какой я молодец
В моём велосипеде:
⭐️ Реализация на двух хешах Redis.
⭐️ Абстрагированная реализация клиента Redis.
⭐️ Сборка метрик в 2 запроса к Redis.
⭐️ Строгая типизация для PHPStan и Psalm.
⭐️ Реальные тесты (пусть их пока и мало).
⭐️ Гораздо более читаемый код (субъективно).
Библиотека успешно внедрена на моём рабочем проекте и в перспективе заменит statsd на Аккаунтах Ely.by.
Так что прошу любить и жаловать:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤4