TGViewer
Channel Public Channel
Пых

Пых

@phpyh

Блог Валентина Удальцова о разработке на PHP.

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

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

Для связи используйте личные сообщения канала.
Subscribers
7.82K
Photos
287
Videos
20
Links
629

Showing posts older than #259 · Back to latest

Older Posts 20 shown
Post #258 8.72K
#[Route(name: self::class)]

Лайфхак для симфонистов. Если вы размещаете каждый экшн в отдельном invokable классе, то его имя можно использовать в качестве имени роута.

При таком подходе не нужно соблюдать никакие конвенции именования и хардкодить строки.

Работает и с атрибутами, и с аннотациями, однако в аннотациях нельзя использовать self, только само имя класса. На скрине оба примера.
Post #257 9.07K
❤️ PHP Russia 2021

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

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

Огромное спасибо @samdark, @Halfnomad и @pronskiy за глубокое понимание и поддержку! С таким программным комитетом можно успешно выступить прямо в аду.

А ещё я был рад видеть вас, подписчиков, в зале! Легко и приятно на сцене, когда с половиной аудитории ты давно в диалоге.

Я счастлив как слон, до встречи на следующей конференции! 🤗
Post #256 9.02K
Post #255 6.97K
Продвинутая интерполяция

Иногда в длинную строку нужно подставить константы / статические свойства или результаты функций / статических методов.

Первой на ум приходит интерполяция, но в PHP она невозможна без переменной, даже при использовании фигурных скобок. То есть вот так нельзя: echo "Число Эйлера: {M_E}". Можно для всех выражений объявить переменные и уже их интерполировать, но получится слишком громоздко. Можно оформить через sprintf, но в многочисленных безымянных %s и %20$d будет легко запутаться.

Костыль Выход есть! Присвоим переменной имя функции strval. Мы получили "интерполятор" callable(mixed): string, при помощи которого в литерал можно подставить любое приводимое к строке выражение:

$intrp = 'strval';
echo "Число Эйлера: {$intrp(M_E)}";

Если пойти чуть дальше и обернуть sprintf в класс с __invoke, зафиксировав первый аргумент (partial application!), получится мощный универсальный интерполятор.

https://3v4l.org/DogHB
Post #254 5.68K
Post #252 5.68K
API Payload Naming Convention

Всё очень просто: чем меньше трансформаций, тем лучше.

Например, вы проектируете API для сервиса на PHP. Ваши потенциальные клиенты — фронт на TypeScript, приложение для Android на Kotlin и приложение для iPhone на Swift. Беглым гуглением выясняем, что все четверо для свойств объектов используют camelCase. Стоит ли выбирать snake_case? Нет.

Только в случае легаси API имеет смысл дальше строгать эндпойнты в том же стиле, чтобы избежать винегрета.
Post #251 10.7K
Continuous Integration

CI — must have для проекта любого размера. CI повышает качество кодовой базы, дисциплинирует команду и сокращает количество и продолжительность ревью.

Идеи проверок на базе нашего пайплайна в Happy Inc.:
• кодстайл (PHP CS Fixer, PHP_CodeSniffer),
• статический анализ (Psalm, PHPStan, PHPMD),
• валидность composer.json/lock (composer validate),
• наличие лишних пакетов (composer-unused),
• отсутствие пакетов в списке явных зависимостей (ComposerRequireChecker),
• уязвимости в пакетах (Roave Security Advisories, Local PHP Security Checker),
• синтаксис Yaml-файлов (Symfony Yaml),
• синтаксис Twig-шаблонов в проектах на Symfony (bin/console lint:twig),
• соответствие типов инъекций контейнера Symfony (bin/console lint:container),
• депрекации сервисов и конфигов Symfony (bin/console debug:container --deprecations),
• маппинг Doctrine и соответствие ему схемы БД (bin/console doctrine:schema:validate),
• конфигурация Doctrine для production (bin/console doctrine:ensure-production-settings --env=prod),
• связность/зацепление и направление зависимостей (Deptrac, dePHPend),
• ну и конечно же, тесты!

Также обратите внимание на репозиторий Static analysis tools for PHP и доклад 25+ инструментов для аудита кода.
  • 👍 3
Post #250 9.14K
🎤 Сегодня я выступаю в Нижнем на митапе про организацию кода!

В 11:10 Денис Юрьев (Skysmart от Skyeng) расскажет, как переделать Symfony-проект в целое направление.

В 12:05 я расскажу, как структурировать код, чтобы не получить «большой ком грязи». Обсудим разные подходы к структурированию, принципы проектирования пакетов и инструменты для контроля.

Если вы в Нижнем, то приходите в Лекторий Правда, если нет — подключайтесь к трансляции на канале PHP Point!

https://youtu.be/SycSx0Qp3eg?t=3876
YouTube PHP NN #4: два доклада для поклонников Symfony и сочувствующих 24 апреля нижегородский php-чат проводит митап с докладами от Валентина Удальцова (PHP Point/Пых) и Дениса Юрьева (Skysmart от Skyeng). Подробности https://phpcommunity.ru/php-nn-4 00:00 Интро 06:10 Метания ядра или как превратить Symfony-проект в целое…
Post #247 8.24K
Чего-то не хватало во вчерашнем сниппете, как-то не по-пыховски было, да? 😅

Я имею в виду, конечно, статанализ. Очевидно, Psalm не знает, что в резалт сете имеются ключи 'question_id' и 'title', и потому генерирует ошибку. Наша задача максимально деликатно ему помочь и явно прописать тип как можно ближе к "источнику".

Ещё вчера стаб для PDOStatement был неполным, но сегодня Мэттью смерджил мой PR, и теперь можно дополнить сниппет соответствующим phpdoc. Напоминаю, что необязательно указывать имя переменной в @var, если аннотируется ближайшее выражение справа.

Вуаля: https://psalm.dev/r/8c9ab50ba2.
Post #246 6.86K
Полезный сниппет

• Nowdoc с именем SQL сразу включает соответствующий Language injection в PhpStorm. После этого строка подсвечивается и автокомплитится (тонко настраивается в SQL Resolution Scope).

• Nowdoc запроса оформлен с комфортным для чтения отступом слева. Отступ не попадёт в результирующую строку, а будет обрезан в соответствии с закрывающим тегом. Доступно с PHP 7.3.

• PDOStatement с рождения является Traversable, а с 8.0 имплементирует IteratorAggregate.

• Строки резалт сета разобраны на переменные прямо в цикле foreach. Доступно с PHP 7.1.
Post #245 7.46K
Post #244 6.91K
👿 Антийода-условия и RTFM

Некоторое время назад я задумался, насколько реально нужны условия Йоды, которые мы тогда по инерции практиковали на проекте.

Рассуждение следующее. Условия Йоды — это способ защитить ногу от пули при использовании присваивания в условиях. Решая надуманную проблему, мы в итоге получаем двукратное ухудшением читабельности кода: и спрятанное в if присваивание, и неестественное условие. Куда правильнее просто запретить присваивания в условиях, а сами условия оформлять как душа бизнес-логика подсказывает.

В итоге мы на проекте отказались от Звёздных войн, и я добавил строчку 'yoda_style' => false в .php_cs.dist, то есть полностью выключил правило.

И только сегодня, спустя 7 месяцев, @EtherLord выяснил, что это правило можно включить в режиме "антийоды": 'yoda_style' => ['equal' => false, 'identical' => false, 'less_and_greater' => false]. Тогда фиксер null !== $value будет преобразовывать в $value !== null и т.д.

RTFM, Валентин 😅

https://cs.symfony.com/doc/rules/control_structure/yoda_style.html
Wikipedia RTFM English phrase initialism
  • 👍 3
Post #242 6.29K
🎤 Интервью #1 с Виктором Большаковым

В эту пятницу в 18:00 по Москве я возьму интервью у Виктора Большакова, директора по разработке в dats.team.

Подписывайтесь на канал PHP Point и включайте напоминание 🔔, чтобы не пропустить стрим!

https://youtu.be/sGbi8A899Lg
YouTube Интервью #1 — Виктор Большаков, директор по разработке в dats.team В эту пятницу узнаем у Виктора Большакова, кто такие CTO и CIO, как ими становятся, чем они занимаются на работе и вне её. Ведущий — Валентин Удальцов. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest…
Post #241 5.84K
Post #240 8.18K
Пых_Логотип.png44.2 KB
Свой логотип!

Пых бодро приближается к отметке в 4.000 подписчиков. В честь этого я решил, что каналу пора поблагодарить за службу забавного серого слоника из Google Картинок и обзавестись айдентикой.

Алина разработала для нас нетривиальный минималистичный логотип, приглашаю вас рассмотреть и проникнуться 🧐
Post #239
Channel photo updated
Post #238 6.02K

Forwarded from PHP Digest

Оператор new в инициализаторах

https://wiki.php.net/rfc/new_in_initializers

Не прошло и недели после стрима, как Никита Попов опубликовал обещанный RFC, разрешающий использовать new в инициализаторах.

Если его примут, то в качестве дефолтных значений статических переменных, параметров, констант и свойств можно будет использовать объекты.

Интересно, что в рамках этого предложения атрибуты тоже получат право использовать объекты. В частности, это позволит оформлять атрибутами композитные констрейнты Symfony Validator (#38503).

https://github.com/php/php-src/pull/6746

// Автор заметки: Валентин Удальцов, канал Пых.
Post #236 6.1K
Давайте перестанем задавать вопрос про дженерики в PHP 😒

Не потому, что их "не добавят", а потому что они давно есть и отлично работают! Ставим Psalm или PHPStan, и вуаля — в нашем распоряжении не только дженерики, но и условные типы, типы пересечений, типизация массивов и колбэков, контроль доступа к свойствам и богатая экосистема плагинов вокруг этого всего!

Мы много лет указывали примитивные типы и аннотации в PHPDoc и особо не жаловались. С релизом PHP 8 абсолютно все встроенные типы и аннотации в форме атрибутов стали доступны на уровне синтаксиса. Лишь дженерики остались в PHPDoc, да и то уже частично поддерживаются в PhpStorm. Неужели в контексте проблем, сопряжённых с добавлением дженериков в PHP, для нас это плохой компромисс?! По-моему, восхитительный!

Пока гоферы обсуждают свой очередной черновик дженериков, прогрессивные пыхари уже давно прокачивают скилл обобщённого программирования и пишут код, типизированный не хуже, чем в TypeScript или Kotlin. Не отставай и ты 😉
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →