fa
Feedback
Пых

Пых

رفتن به کانال در Telegram

Блог Валентина Удальцова о разработке на PHP. Хобот @phpyhobot https://youtube.com/@phpyh https://vkvideo.ru/@phpyh https://t.me/isPHPdying Статистика: https://t.me/INOTAROBOT?start=st1219340804 Для связи используйте личные сообщения канала.

نمایش بیشتر
7 908
مشترکین
-1224 ساعت
-507 روز
-15030 روز
آرشیو پست ها
Пых
7 908
Thesis DIC Мне вчера очень понравилось. Смотревшим тоже. Так зачем себе отказывать в удовольствии? Продолжим изучать мой DIC через час в 18 по Москве! https://youtube.com/live/9jh_CswkPQw

Пых
7 908
В этом квартале при каждой встрече с клиентами возникал один и тот же вопрос: как извлечь выгоду из AI и получить положительн
В этом квартале при каждой встрече с клиентами возникал один и тот же вопрос: как извлечь выгоду из AI и получить положительную отдачу от инвестиций? Мой ответ таков: это сложный вопрос, на который AI не предлагает простого ответа. Причина в том, что AI не уменьшает сложность, а, наоборот, увеличивает её на всех уровнях: таланты, архитектура, процессы, управление и модели. Кодирование автоматизируется, разработка — нет. Чем лучше AI пишет код, тем важнее становится разработка решений на последнем этапе и успешное развертывание.
https://devby.io/news/epam-2-quarter Любопытную статью скинул @oleynikgleb. В ваших компаниях так же?

Пых
7 908
Смотрим Thesis DIC 🎁 Залетайте через 10 минут! https://youtube.com/live/L3yxCCppWfQ

Пых
7 908
Спасибо огромное за советы и поддержку! Вот какие выводы я сделал из ваших комментариев и личных сообщений: У меня замечательная отзывчивая аудитория. В эти времена человеческое в людях ценно как никогда. Нам нужно больше общаться и взаимодействовать, чтобы вместе преодолевать стресс и новые вызовы меняющейся на глазах профессии. Спорт всему голова. Я периодически пытаюсь возвращаться к бегу. И велик у меня тоже есть. Что если мы в Москве соберёмся на велозаезд? Буду рад, если кто-то поможет организовать (пишите в сообщения каналу). PHP жив и интересен, просто интерес к нему постепенно трансформируется из активного (написание кода) к наблюдательскому (история, идеи, эксперименты). Мне кажется, что программирование в эпоху ИИ со временем перейдёт в категорию а-ля кулинария или столярка: мало кто сам готовит или делает стулья, но смотреть всё равно интересно. Все выбрали разные направления развития канала, но "стримы" указал практически каждый из вас. И, как кто-то правильно заметил, стрим — наименее требовательная из активностей (открыл ебало и погнал). ⸻ Поэтому сегодня стрим! С рождением сына я далеко не всегда могу стримить поздно вечером, так что залетайте на часик в 17:00 ← кстати, это кликабельная дата в телеге! Запись будет, как обычно, для всех. Что мы будем обсуждать? А давайте Thesis DIC! Я им периодически пользуюсь и даже доволен. Покажу основные заложенные идеи и фичи, а вы поспрашиваете/покидаете свои кейсы использования контейнера. Ссылку на стрим скину чуть позже.

Пых
7 908
Мне нужна помощь, дорогие Пыхари На свой страх и риск хочу поделиться личным и спросить совета. Мне в последнее время тяжело собираться с мыслями и браться за дело. Эдакая хандра напала. Вроде бы много идей и планов, но ничего не клеится. И нет какой-то конкретной видимой причины, которая меня подкосила. Все события последних месяцев по чуть-чуть внесли свою лепту. На прошлой неделе обратился к психологу, потому что понял, что самостоятельно из этого состояния пока выбраться не получается. Мы пришли к тому, что, во-первых, стоит начать с простых действий, чтобы победить прокрастинацию, во-вторых, восстановить физическую форму и наладить режим, ибо «в здоровом теле здоровый дух». Мне очень помогла эта встреча, и я уже сделал первые шаги. А ещё решил не гадать, куда дальше двигать Пых, а просто спросить вас. Что вас беспокоит? Что вам интересно? Как я могу быть полезен PHP-сообществу в 2026 году? Ниже перечислю все свои идеи, а от вас буду рад получить по ним обратную связь. Пыхник Первым делом я сегодня вернулся к организации Пыхника. Краудфандинг мы не собрали, поэтому, как я и обещал пару недель назад, проведём его полностью онлайн. Это решение не меняется. Только что собирались программным комитетом. Конкретику объявим в ближайшие дни. Стримы Я соскучился по стримам, по живому онлайн-общению. Но когда проходит какое-то время, возникает вопрос: а это всё ещё актуально? Я бы с радостью продолжил смотреть ваши проекты на PHP-линче, обсудил бы принятые RFC и что будет в PHP 8.6. Пишите, если интересно. Ещё я всегда восхищаюсь блогерами, которые записывают длинные серии видео и стримов про создание чего-либо (например, 90 роликов Игоря Негоды про самодельный гоночный болид) и не стесняются ошибок по пути. В теории, я бы мог так же делать статический анализатор Typhoon или Thesis DIC или что угодно ещё. Но очень трудно преодолеть перфекционизм. Поэтому если вам действительно интересно смотреть не только на результат, но и на сам процесс со всеми ошибками и тупиками — напишите об этом. Курс асинхронного PHP В начале этого года я провёл закрытый пилот курса асинхронного PHP. Ребятам понравилось, и я с радостью прочитаю следующий поток для 20-30 желающих. Вопрос простой: есть ли среди вас те, кому нужен такой курс? Интервью Мне кажется интересной идея сделать серию интервью с русскоязычными разработчиками, причастными к самому PHP и его экосистеме, чтобы запечатлеть портрет сообщества. Можно пригласить людей, написавших книги, организовавших мероприятия, построивших команды и продукты на PHP. AI Отдельный вопрос — ждёте ли вы от Пыха больше контента про AI-разработку? Сам я не хочу изображать из себя AI-эксперта, но могу найти людей, которые действительно глубоко в теме, и собрать что-то полезное: от интервью до хардкорного курса по агентной разработке без буллшита. Вот такой список получился. Мне очень поможет любой конструктивный комментарий. Заранее спасибо. Всем отличного самочувствия! 💙

Пых
7 908
Мой размышления про сложности перехода к агентскому кодингу в ответ на пост Глеба Михеева.

Пых
7 908
Repost from Пых.конф
Программа Пыхника’26 У нас сразу три отличные новости! 🔥 Мы расширили программу: вместо запланированных восьми секций на Пых
+1
Программа Пыхника’26 У нас сразу три отличные новости! 🔥 Мы расширили программу: вместо запланированных восьми секций на Пыхнике’26 будет одиннадцать. Все доклады из шорт-листа оказались слишком крутыми, и мы решили никого не вычёркивать. Цена билета та же. 🥳 Онлайн-доклады пройдут в прямом эфире с 7 по 9 сентября. Пыхник’26 теперь не однодневное мероприятие, а целая PHP-неделя, которая завершится большой офлайн-встречей 11 сентября в Art Village. 🤩 Первый онлайн-доклад Дмитрия Dantes будет открытым! Посмотреть его смогут все желающие. 7 сентября 📹 • Компилируемый PHP: перспективы и возможности — Дмитрий Dantes 8 сентября 📹 • AI-first архитектура PHP-приложений — Дмитрий Кириллов • Возвращаем gRPC в PHP — Вадим Занфир 9 сентября 📹 • Testo: тестирование со вкусом хинкали — Алексей Гагарин 11 сентября 🏠 • Request-Reply без ожидания и блокировок — Валентин Удальцов • От скучной генерации к инженерии с ИИ — Данил Щуцкий • Ломаем PHP-системы, чтобы они не падали — Маргарита Моногарова • PHP в бинарнике на примере YiiPress — Александр Макаров • Архитектура интеграций в PHP: как пережить чужие API — Олег Мифле • AI-трансформация в PHP-команде: куда переехал bottleneck — Денис Кукуреко • Флипчарт-сессия «Архитектурный экстремизм» Программа готова — дальше дело за вами: https://planeta.ru/campaigns/pyhnik26 Билет теперь можно оплатить от компании — присылайте на conf@phpyh.ru тип, количество, реквизиты.

Пых
7 908
Одной проблемой в Rector меньше Подписчик Илья Манютин зарешал тикет, который я на прошлой неделе открыл в Rector. Спасибо огромное за потраченное время и токены! После релиза с удовольствием уберу ClassPropertyAssignToConstructorPromotionRector из skip.

Пых
7 908
У меня самые умные подписчики в IT 💙 — нашли ошибку за секунды. Ну а для меня этот комментарий стал поводом разложить всё по полочкам. DI — Dependency Injection Подход, при котором код явно декларирует необходимые зависимости и получает их снаружи, а не создаёт, не хардкодит и не извлекает их сам.

function logToFile(string $message): void
{
    // не DI
    file_put_contents(__DIR__ . '/../app.log', $message, FILE_APPEND);
}

final class StreamLogger extends Psr\Log\AbstractLogger
{
    public function __construct(
        // DI
        private string $stream,
    ) {}

    // ...
}
Как видите, зависимостью может быть что угодно, не только интерфейс: строка, число, инстанс финального класса. Здесь часто проводят параллель с принципом Голливуда («Don’t call us, we’ll call you»): не ищите зависимости, мы их для вас соберём и передадим. Мне ещё нравится на пальцах объяснять так:
Привет, я A, моя компетенция — α. Чтобы выполнить α, мне потребуются: x, опционально y и кто-то, кто умеет β. Предоставите — всё сделаю. Нет — сорян.
Зависимости можно передавать через конструктор, параметр метода, путём клонирования with-методом (поддерживается в Symfony и Thesis DIC) или через сеттер (не рекомендую, так как мутабельно и можно получить неполный стейт или проблемы похуже в асинхронном сетапе). DIC — Dependency Injection Container Сугубо опциональная вещь! Контейнер призван облегчить сборку графа зависимостей в крупном проекте, но никто не мешает собирать приложение руками:

// код в стиле DI, но контейнера нет
$app = new App(
    logger: new StreamLogger(__DIR__ . '/../app.log'),
);
Большинство современных библиотек написано в стиле DI, но не требует контейнера. В README как раз обычно и показывают, как всё собрать "на коленке". DIP — Dependency Inversion Principle Последний принцип из SOLID. Он призван снизить каплинг и повысить переиспользуемость кода за счёт опоры на абстракции. Обратите внимание, что в оригинальной формулировке принципа не используется понятие «интерфейс»:
A. High level modules should not depend upon low level modules. Both should depend upon abstractions. B. Abstractions should not depend upon details. Details should depend upon abstractions.
Robert C. Martin, «The Dependency Inversion Principle», C++ Report, 1996 В C++, о котором идёт речь в статье, не было отдельной языковой конструкции interface: Мартин выражал объектные интерфейсы чисто абстрактными классами. Но в той же статье он отдельно приводит stdio.h как пример Dependency Inversion без всяких классов и виртуальных методов. В наш StreamLogger тоже можно передать не только путь к локальному файлу:

$stdOutLogger = new StreamLogger('php://stdout');

$compressedLogger = new StreamLogger('compress.zlib:///var/log/app.log.gz');

$remoteLogger = new StreamLogger('ftp://logger:secret@logs.example.com/app.log');
Внезапно для работы с разными потоками нам не потребовался interface! Строковый URI выбирает конкретную реализацию, а StreamLogger работает через общую абстракцию PHP-стримов. Инверсия зависимостей здесь реализована не в нашем коде, а в PHP: контракт — PHP Streams API, конкретные врапперы — file, php, compress.zlib, ftp и пользовательские протоколы. StreamLogger пользуется этим контрактом, не зная, какая реализация скрывается за URI. Получается, «абстракция» не тождественна интерфейсу или абстрактному классу. Даже финальный класс может абстрагировать вызывающий код от деталей реализации, пока сохраняет публичный контракт. И вот тут-то мы и нащупали причину, по которой интерфейс может быть избыточным: Если тип сам выражает требуемую клиенту стабильную абстракцию и не протекает низкоуровневыми деталями — на него можно опереться напрямую. ⸻ 🌿 Анонсировали доклады Данилы Щуцкого и Саши Макарова на Пыхнике!

Пых
7 908
Найдите ошибку в терминологии.
Найдите ошибку в терминологии.

Пых
7 908
Ура! Если кто-то хочет пофиксить, вот вам готовая несложная задачка.
Ура! Если кто-то хочет пофиксить, вот вам готовая несложная задачка.

Пых
7 908
Rector, это не то же самое!!! Пошёл делать тикет и нашёл уже существующий с ровно такой же проблемой. И знаете, что там ответ
Rector, это не то же самое!!! Пошёл делать тикет и нашёл уже существующий с ровно такой же проблемой. И знаете, что там ответил мейнтейнер?
That's expected, if the type not match, that means a design issue in the first place, if property is private and nullable, and filled via constructor, that means the constructor should be nullable param as well as it just assign -> fill, no nullable check.
Почему он неправ Есть большая разница между состоянием, в котором объект оказывается при создании, и состоянием, в которое он может прийти по ходу выполнения логики. В моём случае null означает «больше нет», а не «никогда не было». Иными словами, тип параметра описывает то, что допустимо на входе, а тип свойства — все состояния объекта за его жизнь. В первую очередь мы декларируем параметр и свойство по отдельности, и уже во вторую рассматриваем возможность склеить их в promoted, но только если типы эквивалентны. Открыл новую issue с моими пояснениями, посмотрим, дойдёт или нет... ⸻ 🌿 Выбрали первый доклад на Пыхник’26!

Пых
7 908
or <=> if Замешивая в 🥟 Testo Алексея Гагарина тикет про исключения, обнаружил такой фрагмент:

$classOrObject->getCode() === 0 or $result->withCode($classOrObject->getCode());
Конформный пыхарь написал бы так:

if ($classOrObject->getCode() !== 0) {
    $result->withCode($classOrObject->getCode());
}
Если что, withCode() мутирующий, $result = не пропущен. Почему or, а не ||? Конкретно в этом случае разницы нет. Но вообще оператор or на самом дне списка приоритетов, даже ниже, чем присваивание. Это позволяет писать так:

$x = foo() or bar(); // ($x = foo()) or bar();

$x = foo() || bar(); // $x = (foo() || bar());
Короче, как вам такой стиль кодирования?

Пых
7 908
Эквайринг Т-Банка. 2026 год Повторное выставление счёта (ручка Init) бросает ошибку о том, что такой заказ уже есть, вместо т
Эквайринг Т-Банка. 2026 год Повторное выставление счёта (ручка Init) бросает ошибку о том, что такой заказ уже есть, вместо того, чтобы идемпотентно вернуть ссылку на оплату (PaymentURL). Окей, допустим. План Б: оборачиваю Init в try/catch и при выпадении соответствующей ошибки о дублирующемся заказе пробую GetState и CheckOrder, которые возвращают инфу по счёта. Но ни в одном из них нет PaymentURL!!! 🤬 То есть у меня есть лишь один шанс записать PaymentURL после получения ответа от Т-Банка. А если ответ не дошёл по сети? А если сервис упал? А если БД нагружена? А если кролик отошёл погрызть морковки? Ну как так-то нахуй... Решение, конечно, есть: при ретрае и ошибке о дубле создавать новый заказ с другим ID. Но это означает, что я уже не могу без таблички скоррелировать ID своего инвойса с их ID. А это дополнительное I/O на пустом месте, брошенные заказы в админке Т-Банка и усложнённое расследование инцидентов. Если у кого-то есть друзья в Т-Банке, попросите исправить этот позор.

Пых
7 908
Про кодогенерируемые контейнеры.

Пых
7 908
پیام ویدیو01:00

Пых
7 908
Первый бенчмарк thesis/dic Смоделировал следующий жизненный сценарий работы неумирающего приложения: Задепоили приложение в р
Первый бенчмарк thesis/dic Смоделировал следующий жизненный сценарий работы неумирающего приложения:
Задепоили приложение в рантайме а-ля RoadRunner, собрали контейнер и готовы принимать запросы. Ни один сервис не инстанциирован, но контейнер максимально готов. Как быстро испытуемые вернут инстанс контроллера с несколькими зависимостями?
Сравнение, конечно, не совсем равнозначное, потому что только у Thesis есть этап диспоуза сервисов после скоупа и не во всех контейнерах есть полноценные scoped сервисы. Но в целом результат ожидаемый. Скомпилированный контейнер Symfony почти эквалентен написанному руками коду (manual). Thesis (current) быстрее конкурентов, потому что рефлексию и резолвинг графа зависимостей он делает на этапе сборки, а в рантайме вызывает полностью готовые фабрики. Для бенчмарка попробовал #[Bench] в 🐘 Testo.

Пых
7 908
Repost from Пых.конф
Запустили краудфандинг!!! 11 сентября в Art Village под Москвой собираем небольшую PHP-конференцию на 120 участников: один поток, 8 докладов и много живого общения. Средства на мероприятие собираем через краудфандинг. Можно взять офлайн-билет, доступ к записям, футболку «Вы вымрете, а я останусь» или просто поддержать проект любой суммой. https://planeta.ru/campaigns/pyhnik26

Пых
7 908
Repost from Пых.конф

Пых
7 908
Repost from Пых.конф