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

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://news.1rj.ru/str/isPHPdying

Статистика: https://news.1rj.ru/str/INOTAROBOT?start=st1219340804

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

Как я проверял ваши решения 🤓

Если ответ был текстовый, то я оценивал правильность идеи. Если ответ был кодом, то я тестировал его при помощи InMemoryCachingReportFactoryTest.php, предварительно адаптировав тест, если были изменены названия классов или добавлены зависимости. Если тест крашился из-за банальной ошибки (например, неинициализированного типизированного свойства), я такой ответ не засчитывал. Если в коде визуально были неточности, но мой несложный тест он проходил, я засчитывал. Думаю, это справедливо, всё-таки совсем непротестированный код на прод заливать не стоит 😉

Победитель 🏆

Первый правильный ответ пришёл от Andrew (@Groonya):
https://gist.github.com/aivchen/39a956afc47634c7f8bb2de4688aa7c1 (PHP 7),
https://gist.github.com/aivchen/5c8d51bed4188910ed34660c3b92fea0 (PHP 8).

Интересно, что в первом сниппете Андрея тоже есть неинициализированное свойство $reports, однако оператор ??= на это по понятным причинам не ругается, поэтому формально код корректный.

Пояснение от меня 💡

Эту задачу я рассмотрю сегодня в рамках своего доклада. Решение выложил отдельным видео на PHP Point. Присоединяйтесь к PHPFest через 2 часа по ссылке https://2020.phpfest.ru/showtime/, всех жду!
Сегодня в начале выступления была заминка из-за того, что у меня не работала команда bin/console demo в специально подготовленном для лайвкодинга проекте.

По скрину поймёте, почему 😂

Как известно, Symfony пробегает все файлы, зарегистрированные в DI как ресурсы, при прогреве кэша в dev. Соответственно, при автозагрузке демонстрационного класса App\Worker в конце файла запускался этот самый воркер и начинал свой бесконечный цикл. Добавил эти строки я на последнем прогоне доклада и конечно же забыл удалить, поэтому сегодня утром "подвисание" команды для меня было полной неожиданностью...

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

🤦🤦‍♂️🤦‍♀️🙈
😅 Я не смог вас сегодня отпустить без подробного разбора вчерашней задачи, поэтому записал по горячим следам небольшой ролик на PHP Point.

Помимо комплексного решения для PHP 7 и PHP 8 я рассказал про маленькую неочевидную особенность \WeakReference и продемонстрировал, как можно тестировать утечки в PHPUnit в стиле тяп-ляп.

https://www.youtube.com/watch?v=r1HDMu7nJh0
На сегодняшний день я участвовал пока только в трёх конференциях по PHP в качестве докладчика, и из них PHPFest отличился самым высоким уровнем организации.

Посудите сами, в результате созвона с командой PHPFest я купил нормальный микрофон, Ethernet-адаптер для стабильного соединения в офисе, и вместе мы добились качественного стриминга задолго до самой конференции.

Большое спасибо @seregazhuk за настойчивость и пунктуальность. После стольких прогонов никакая техническая проблема в моём сетапе не могла меня смутить, потому что я был на 110% уверен в своём докладе.

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

@phpfest, вы огонь, спасибо за такой высокий уровень, пожалуйста, не расслабляйтесь, а остальные — подтягивайтесь!
При помощи Generator::valid() можно проверить генератор на пустоту, не обходя его целиком.

После вызова $generator->valid() функция генератора начинает выполнение и доходит либо до первого yield (тогда valid возвращает true), либо до конца (valid возвращает false). Интересно, что в первом случае на генераторе можно вызвать rewind без каких-либо последствий, так как обход ещё не начался. Во втором случае генератор закрывается и обойти его уже нельзя.

Сравните: https://3v4l.org/LL8E9 и https://3v4l.org/jni5Y.
Я в начале своего пути 🐣
Завтра в 11 по Москве в пыхэфире Краснодар!

• 11:00 — Быстрый способ разобраться с легаси и начать жить (Сергей Жук, Skyeng)

• 12:00 — Автотесты: как тестировать нетестируемое (Артем Прозоров, ZeBrains)

• 13:00 — Как жить, если у тебя не хайлоад: истории из практики работы с реляционными БД (Валерий Горбачев, PHP Krasnodar)

Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.

https://www.youtube.com/watch?v=Uezd5ocJQ9I

Темы задорные, постараюсь встать вовремя 😜
Пых
Завтра в 11 по Москве в пыхэфире Краснодар! • 11:00 — Быстрый способ разобраться с легаси и начать жить (Сергей Жук, Skyeng) • 12:00 — Автотесты: как тестировать нетестируемое (Артем Прозоров, ZeBrains) • 13:00 — Как жить, если у тебя не хайлоад: истории…
Цитирую @seregazhuk:

Не бывает кода, который потом понадобится. Выкидывайте! Есть гит, он всё помнит. Как правило, "код который понадобится" никогда не понадобится.

Я тоже советую чаще делать выбор в пользу удаления. Если коммиты атомарные и с хорошим комментарием, найти их в истории и восстановить не составит труда. А вот кода любого сорта, в том числе WTF-, непокрытого и потенциально уязвимого автоматически станет меньше.

https://www.youtube.com/watch?v=Uezd5ocJQ9I&t=1133
Build Stuff Software Development 2020 уже в эту среду!

Build Stuff проводят на этой неделе конференцию и предложили мне разыграть на канале 5 билетов. Мероприятие традиционно проходит в Европе, но в этом непростом году пройдёт онлайн.

Конференция будет в эфире три дня (11-13 ноября), и на ней обсудят все баззворды на свете от машин лёрнинга до девопса. Меня особенно заинтересовала секция Hiding The Lead (13 ноября в 11:00) Сэма Ньюмена, авторитетного автора книг по микросервисной архитектуре.

К сожалению, придумать хорошую задачу в этот раз не успеваю, разыграем 5 билетов рандомно 🎲

Заполняйте форму сегодня до полуночи, и завтра в Пыхтелке я объявлю победителей.
Завтра в 11 по Москве в пыхэфире Нижний!

• 11:00 — MySQL vs Postgres (Антон Робуль)

• 12:00 — Полезные привычки для программистов (Олег Скляров, Skyeng)

• 13:00 — Очередной проект: взлетит или нет (Сергей Пантюшин, ВодоходЪ)

Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.

https://youtu.be/pe3b0DHVnq8
PHP 🎱

Уже завтра, за день до релиза, будет большой стрим про PHP 8 от Skyeng, PHP Russia и PHP Point!

В программе:
• дискуссия о развитии PHP с Альбертом Степанцевым,
• обзор новых фич восьмёрки от меня,
• Q&A с ключевыми разработчиками PHP Дмитрием Стоговым и Никитой Поповым.

Ведущие Александр Макаров и Роман Пронский.

Подключайтесь, общайтесь и задавайте вопросы! Начало в 19 по Москве 🕖

https://www.youtube.com/watch?v=QSszmWIrRyw
Встречаем PHP 8!

🔴 Трансялция на PHP Point: https://www.youtube.com/watch?v=QSszmWIrRyw.

🗺 Слайды моей презентации: https://vudaltsov.github.io/php8-slides/.
Прямо сейчас очень интересная дискуссия Дмитрия Стогова и Никиты Попова про типы, компиляцию, async/await, корутины и траекторию развития PHP.

https://www.youtube.com/watch?v=QSszmWIrRyw
Deprecations

Чтобы проект был всегда готов к обновлению языка и зависимостей, я рекомендую следить за депрекациями (устаревшими возможностями) и фиксить их как можно раньше.

Сегодня в PHP для этого полно инструментов, мы с командой пользуемся этими:

Deprecated* issue в Psalm (в PHPStan есть phpstan-deprecation-rules);

канал deprecation в Monolog (см. рецепт MonologBundle);

команда debug:container --deprecations (выводит список устаревших сервисов, замеченных при сборке DI контейнера Symfony);

вкладка Deprecations в разделе Logs в Symfony Profiler;

подписка на релизы пакетов и внимательное их изучение.
Ребята в Пыхтелке напомнили про Symfony PHPUnit Bridge.

В этом пакете есть SymfonyTestsListener, который в том числе умеет учитывать депрекации при тестировании. Его необязательно использовать с simple-phpunit, можно со стандартным phpunit. Подробнее о подключении и настройке читайте в документации.

Спасибо @chi_teck и @andrewDemb.
dbal:run-sql

Недавно абсолютно случайно наткнулся на команду dbal:run-sql (всё-таки полезно гулять по папке vendor 🤓). Она поставляется с пакетом Doctrine DBAL, поэтому доступна не только симфонистам и ормщикам.

При помощи команды можно выполнить SQL запрос через любое сконфигурированное в приложении подключение, не заморачиваясь с доступами. Очень удобно использовать в Makefile и CI.

bin/console dbal:run-sql \
--connection=name \
'select ... from ...'
Как избавиться от лишних неявных зависимостей 🧹

Рассмотрим классический пример про полифилы. Symfony Console версии 5.1 использует функцию is_countable, которая появилась в PHP 7.3. Чтобы поддерживать PHP 7.2, пакет требует полифил symfony/polyfill-php73. Поэтому когда мы устанавливаем symfony/console в проекте с PHP 7.4, мы получаем не только компонент, но и полифил PHP 7.3, который нам, очевидно, не нужен.

Чтобы его удалить, нужно в composer.json в разделе replace прописать "symfony/polyfill-php73": "*" и выполнить update. Аналогично можно убрать полифилы расширений PHP, предварительно гарантировав их наличие через require ext-<name> (см. сниппет).

ComposerRequireChecker (на страже в CI) поможет не увлечься и не удалить лишние пакеты. Он проверит, что все используемые в проекте символы (функции, константы и классы) содержатся в зависимостях, явно прописанных в require.

В сниппете фрагменты composer.json из нашего проекта в Happy Inc.
Вдохновляющая статья про PHP от Мэтью Брауна, автора Psalm.

I’m here to tell you that it can, and Vimeo’s continued success with PHP is proof that it’s a great tool for fast-moving companies in 2020.

https://medium.com/vimeo-engineering-blog/its-not-legacy-code-it-s-php-1f0ee0462580

Только мыть, конечно, лучше сверху вниз, а не наоборот 😄
Привет, пыхари ☃️

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

Однако чтобы все проводили время с макимальной пользой и отдачей, консультации теперь будут в формате созвона и платными. Вы сможете спрашивать подробнее и сразу получать ответы, а я буду знать, что не зря не успеваю вечером поиграть на 🥁

Пишите мне (@vudaltsov), о чём хотите поговорить. Если я достаточно в теме, согласуем дату и время созвона. Дальше по ситуации. Пока ставка 3000 рублей в час. Если спрос будет большим, она может вырасти 😉
📖 Только что купил и начал читать Introducing EventStorming, основополагающий труд по ивент стормингу от автора этого подхода, Альберто Брандолини.

Ивент сторминг ("событийный штурм") — это формат совещания, на котором разработчики и доменные эксперты вместе проясняют предметную область. Результатом такого обсуждения является набор бизнес-процессов, сформулированных в терминах DDD. Подробнее на Википедии.

У кого сейчас есть время и желание, го читать параллельно со мной, через недельку обсудим в Пыхтелке 👌

https://www.eventstorming.com/book/