Пых
8.26K subscribers
263 photos
16 videos
6 files
579 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
Обновление рецептов Symfony Flex

Если вы используете Symfony Flex, рекомендую вместе с пакетами обновлять и рецепты. Особенно при минорных и мажорных апдейтах. Это делается в три шага:
composer sync-recipes --force,
• проверяем (и, скорее всего, частично откатываем) измененые файлы,
• коммитим.

Команда sync-recipes --force накатывает только обновлённые рецепты и фиксирует их версии в файл symfony.lock. То есть если сразу же выполнить её ещё раз, уже ничего не произойдёт.

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

Чтобы всегда легко обновлять рецепты, не меняйте расположение и логику конфигов в папке config/packages. Вносите изменения так, чтобы потом было легко их идентифицировать в диффах. При конфигурации вендорных библиотек и бандлов без рецептов добавляйте для каждого свой файл конфига с соответствующим именем.
Про рекламу и вакансии

На текущий момент на канале Пых нет платной рекламы. Я рекомендую только то, что ± относится к PHP и пришлось мне по душе.

По поводу упоминания компаний и размещения вакансий для пыхарей у меня особая позиция. Все мы так или иначе ищем работу (активно или на перспективу), поэтому эта информация действительно полезна и релевантна. Однако последнее, чего бы хотелось, это чтобы Пых превратился в доску объявлений про знание PHP 5.3+ на уровне разговорного. Поэтому я всегда предлагаю рекрутерам совместно сделать контент поувлекательнее. Например, небольшое онлайн-интервью с представителем тех- и HR-отдела, в котором я задам несколько вопросов о позиции, проекте и почему PHP. Уверен, это было бы интересно всем и принесло бы куда больше откликов. Тем не менее все ранее писавшие мне рекрутеры горячо со мной согласились, но так и не вернулись 😓

Я верю в вас, уважаемые эйчары, и жду ваших идей! @vudaltsov
Сегодня в 19:30 по Москве Пётр, Роман и я наденем леггинсы, наполним стаканы смузи и зачилим в Clubhouse, чтобы обсудить первые впечателния от PHP 8.

Если у вас есть айфон или не лень запустить эмулятор, присоединяйтесь!

https://www.joinclubhouse.com/event/ma4lpZXL
Как в коллбэке array_map получить не только значение, но и ключ?

Передать ключи третьим аргументом!

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

Если не увидели проблему, не отвечайте сразу "этому коду не помочь". Что называется, take your time. Цель задачи — проверить знания в нескольких областях: итераторы, генераторы, замыкания, PHP 8.

И да, она, конечно, не для собеседования, скорее для гимнастики.

https://t.iss.one/phpquiz/456
Завтра в 11:00 по Москве будет большой стрим про PHP в 2021-ом году!

🎤 Доклады:

• про WebRTC от Ильи Левина из Skyeng,
• про gRPC от Антона Жукова из ManyChat.

🏄 Острые дискуссии, мнения о 2020, планы на 2021:

• Александр Макаров (Yii),
• Антон Околелов (Цинковый прод),
• Валентин Удальцов (Пых),
• Дмитрий Елисеев (ElisDN),
• Константин Буркалев (SDCast),
• Никита Попов (PHP core team),
• Николай Пучко (PHP.Today),
• Петр Мязин (Пятиминутка PHP),
• Роман Пронский (PHP Дайджест),
• Сергей Жук (Между Скобок).

🎁 Итоги опроса про лучшее из мира PHP за 2020 и вручение подарков.

https://youtu.be/6JF2U39J4RY
Основные итоги опроса про лучшее из мира PHP за 2020 🔥

🥈 В номинации Персона года я занял 2-ое место между Никитой Поповым и Александром Макаровым.

🥈 В номинации Канал года Пых занял 2-ое место между PHP Digest и PHP задачи с собеседований.

🥈 В номинации YouTube-канал года наш с Ромой PHP Point занял 2-ое место между HighLoad Channel и Skyeng ITeam.

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

Мы все уверенно шагаем в 2021-ом, и дальше будет только круче!

Итоги опроса смотрите на https://phpcommunity.ru/brave-new-2021.
Как получить все типы значения

Для примитивов всё просто — в PHP 8 теперь есть функция get_debug_type, она возвращает тип в привычном формате.

В случае объекта помимо класса нужно вернуть список суперклассов (умное название для родительских) и интерфейсов. Проще всего их добыть встроенными функциями class_parents и class_implements.

Что касается порядка отдаваемых типов, как правило, требуется сортировка от конкретных к абстрактным. Например, при поиске обработчика значения по типу имеет смысл сначала запросить узкоспециальный обработчик, а затем — универсальный.

https://3v4l.org/DFuO8
Давайте перестанем задавать вопрос про дженерики в PHP 😒

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

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

Пока гоферы обсуждают свой очередной черновик дженериков, прогрессивные пыхари уже давно прокачивают скилл обобщённого программирования и пишут код, типизированный не хуже, чем в TypeScript или Kotlin. Не отставай и ты 😉
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

// Автор заметки: Валентин Удальцов, канал Пых.
Channel photo updated
Пых_Логотип.png
44.2 KB
Свой логотип!

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

Алина разработала для нас нетривиальный минималистичный логотип, приглашаю вас рассмотреть и проникнуться 🧐
🎤 Интервью #1 с Виктором Большаковым

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

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

https://youtu.be/sGbi8A899Lg
👿 Антийода-условия и 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
👍3
Полезный сниппет

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

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

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

• Строки резалт сета разобраны на переменные прямо в цикле foreach. Доступно с PHP 7.1.
Чего-то не хватало во вчерашнем сниппете, как-то не по-пыховски было, да? 😅

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

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

Вуаля: https://psalm.dev/r/8c9ab50ba2.