Как получить все типы значения
Для примитивов всё просто — в PHP 8 теперь есть функция get_debug_type, она возвращает тип в привычном формате.
В случае объекта помимо класса нужно вернуть список суперклассов (умное название для родительских) и интерфейсов. Проще всего их добыть встроенными функциями class_parents и class_implements.
Что касается порядка отдаваемых типов, как правило, требуется сортировка от конкретных к абстрактным. Например, при поиске обработчика значения по типу имеет смысл сначала запросить узкоспециальный обработчик, а затем — универсальный.
https://3v4l.org/DFuO8
Для примитивов всё просто — в PHP 8 теперь есть функция get_debug_type, она возвращает тип в привычном формате.
В случае объекта помимо класса нужно вернуть список суперклассов (умное название для родительских) и интерфейсов. Проще всего их добыть встроенными функциями class_parents и class_implements.
Что касается порядка отдаваемых типов, как правило, требуется сортировка от конкретных к абстрактным. Например, при поиске обработчика значения по типу имеет смысл сначала запросить узкоспециальный обработчик, а затем — универсальный.
https://3v4l.org/DFuO8
Давайте перестанем задавать вопрос про дженерики в PHP 😒
Не потому, что их "не добавят", а потому что они давно есть и отлично работают! Ставим Psalm или PHPStan, и вуаля — в нашем распоряжении не только дженерики, но и условные типы, типы пересечений, типизация массивов и колбэков, контроль доступа к свойствам и богатая экосистема плагинов вокруг этого всего!
Мы много лет указывали примитивные типы и аннотации в PHPDoc и особо не жаловались. С релизом PHP 8 абсолютно все встроенные типы и аннотации в форме атрибутов стали доступны на уровне синтаксиса. Лишь дженерики остались в PHPDoc, да и то уже частично поддерживаются в PhpStorm. Неужели в контексте проблем, сопряжённых с добавлением дженериков в PHP, для нас это плохой компромисс?! По-моему, восхитительный!
Пока гоферы обсуждают свой очередной черновик дженериков, прогрессивные пыхари уже давно прокачивают скилл обобщённого программирования и пишут код, типизированный не хуже, чем в TypeScript или Kotlin. Не отставай и ты 😉
Не потому, что их "не добавят", а потому что они давно есть и отлично работают! Ставим Psalm или PHPStan, и вуаля — в нашем распоряжении не только дженерики, но и условные типы, типы пересечений, типизация массивов и колбэков, контроль доступа к свойствам и богатая экосистема плагинов вокруг этого всего!
Мы много лет указывали примитивные типы и аннотации в PHPDoc и особо не жаловались. С релизом PHP 8 абсолютно все встроенные типы и аннотации в форме атрибутов стали доступны на уровне синтаксиса. Лишь дженерики остались в PHPDoc, да и то уже частично поддерживаются в PhpStorm. Неужели в контексте проблем, сопряжённых с добавлением дженериков в PHP, для нас это плохой компромисс?! По-моему, восхитительный!
Пока гоферы обсуждают свой очередной черновик дженериков, прогрессивные пыхари уже давно прокачивают скилл обобщённого программирования и пишут код, типизированный не хуже, чем в TypeScript или Kotlin. Не отставай и ты 😉
Forwarded from PHP Digest
Оператор new в инициализаторах
https://wiki.php.net/rfc/new_in_initializers
Не прошло и недели после стрима, как Никита Попов опубликовал обещанный RFC, разрешающий использовать
Если его примут, то в качестве дефолтных значений статических переменных, параметров, констант и свойств можно будет использовать объекты.
Интересно, что в рамках этого предложения атрибуты тоже получат право использовать объекты. В частности, это позволит оформлять атрибутами композитные констрейнты Symfony Validator (#38503).
https://github.com/php/php-src/pull/6746
// Автор заметки: Валентин Удальцов, канал Пых.
https://wiki.php.net/rfc/new_in_initializers
Не прошло и недели после стрима, как Никита Попов опубликовал обещанный RFC, разрешающий использовать
new
в инициализаторах.Если его примут, то в качестве дефолтных значений статических переменных, параметров, констант и свойств можно будет использовать объекты.
Интересно, что в рамках этого предложения атрибуты тоже получат право использовать объекты. В частности, это позволит оформлять атрибутами композитные констрейнты Symfony Validator (#38503).
https://github.com/php/php-src/pull/6746
// Автор заметки: Валентин Удальцов, канал Пых.
Пых_Логотип.png
44.2 KB
Свой логотип!
Пых бодро приближается к отметке в 4.000 подписчиков. В честь этого я решил, что каналу пора поблагодарить за службу забавного серого слоника из Google Картинок и обзавестись айдентикой.
Алина разработала для нас нетривиальный минималистичный логотип, приглашаю вас рассмотреть и проникнуться 🧐
Пых бодро приближается к отметке в 4.000 подписчиков. В честь этого я решил, что каналу пора поблагодарить за службу забавного серого слоника из Google Картинок и обзавестись айдентикой.
Алина разработала для нас нетривиальный минималистичный логотип, приглашаю вас рассмотреть и проникнуться 🧐
PHP Digest Лайв #200
Сегодня проводим его вместе с Ромой! Присоединяйтесь 🔥
https://youtu.be/Y4KH_2TjRrE
Сегодня проводим его вместе с Ромой! Присоединяйтесь 🔥
https://youtu.be/Y4KH_2TjRrE
YouTube
PHP Digest Live #200. Валентин Удальцов, новости PHP 8.1, стандарт PSR, файберы, инициализаторы
Вместе с Валентином Удальцовым разбираем последние новости и ссылки из мира PHP. Предложения для PHP 8.1: объекты в инициализаторах, неймспейсы для расширений, жаркое голосование по файберам, новый тип noreturn от авторов Psalm и PHPStan. Черновик нового…
🎤 Интервью #1 с Виктором Большаковым
В эту пятницу в
Подписывайтесь на канал PHP Point и включайте напоминание 🔔, чтобы не пропустить стрим!
https://youtu.be/sGbi8A899Lg
В эту пятницу в
18:00
по Москве я возьму интервью у Виктора Большакова, директора по разработке в dats.team.Подписывайтесь на канал PHP Point и включайте напоминание 🔔, чтобы не пропустить стрим!
https://youtu.be/sGbi8A899Lg
YouTube
Интервью #1 — Виктор Большаков, директор по разработке в dats.team
В эту пятницу узнаем у Виктора Большакова, кто такие CTO и CIO, как ими становятся, чем они занимаются на работе и вне её.
Ведущий — Валентин Удальцов.
Подписывайтесь на наши каналы в Telegram:
• Пых https://www.tg-me.com/phpyh,
• PHP Digest https://www.tg-me.com/phpdigest…
Ведущий — Валентин Удальцов.
Подписывайтесь на наши каналы в Telegram:
• Пых https://www.tg-me.com/phpyh,
• PHP Digest https://www.tg-me.com/phpdigest…
👿 Антийода-условия и RTFM
Некоторое время назад я задумался, насколько реально нужны условия Йоды, которые мы тогда по инерции практиковали на проекте.
Рассуждение следующее. Условия Йоды — это способ защитить ногу от пули при использовании присваивания в условиях. Решая надуманную проблему, мы в итоге получаем двукратное ухудшением читабельности кода: и спрятанное вдуша бизнес-логика подсказывает.
В итоге мы на проекте отказались от Звёздных войн, и я добавил строчку
И только сегодня, спустя 7 месяцев, @EtherLord выяснил, что это правило можно включить в режиме "антийоды":
RTFM, Валентин 😅
https://cs.symfony.com/doc/rules/control_structure/yoda_style.html
Некоторое время назад я задумался, насколько реально нужны условия Йоды, которые мы тогда по инерции практиковали на проекте.
Рассуждение следующее. Условия Йоды — это способ защитить ногу от пули при использовании присваивания в условиях. Решая надуманную проблему, мы в итоге получаем двукратное ухудшением читабельности кода: и спрятанное в
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
Уже через 5 минут к нам в гости на PHP Point заглянет Виктор Большаков, и мы из первых уст узнаем, кто такие CTO!
Присоединяйтесь к эфиру и задавате вопросы!
https://youtu.be/sGbi8A899Lg
Присоединяйтесь к эфиру и задавате вопросы!
https://youtu.be/sGbi8A899Lg
YouTube
Интервью #1 — Виктор Большаков, директор по разработке в dats.team
В эту пятницу узнаем у Виктора Большакова, кто такие CTO и CIO, как ими становятся, чем они занимаются на работе и вне её.
Ведущий — Валентин Удальцов.
Подписывайтесь на наши каналы в Telegram:
• Пых https://www.tg-me.com/phpyh,
• PHP Digest https://www.tg-me.com/phpdigest…
Ведущий — Валентин Удальцов.
Подписывайтесь на наши каналы в Telegram:
• Пых https://www.tg-me.com/phpyh,
• PHP Digest https://www.tg-me.com/phpdigest…
Полезный сниппет
• Nowdoc с именем
• Nowdoc запроса оформлен с комфортным для чтения отступом слева. Отступ не попадёт в результирующую строку, а будет обрезан в соответствии с закрывающим тегом. Доступно с PHP 7.3.
•
• Строки резалт сета разобраны на переменные прямо в цикле
• Nowdoc с именем
SQL
сразу включает соответствующий Language injection в PhpStorm. После этого строка подсвечивается и автокомплитится (тонко настраивается в SQL Resolution Scope).• Nowdoc запроса оформлен с комфортным для чтения отступом слева. Отступ не попадёт в результирующую строку, а будет обрезан в соответствии с закрывающим тегом. Доступно с PHP 7.3.
•
PDOStatement
с рождения является Traversable, а с 8.0 имплементирует IteratorAggregate.• Строки резалт сета разобраны на переменные прямо в цикле
foreach
. Доступно с PHP 7.1.Чего-то не хватало во вчерашнем сниппете, как-то не по-пыховски было, да? 😅
Я имею в виду, конечно, статанализ. Очевидно, Psalm не знает, что в резалт сете имеются ключи
Ещё вчера стаб для
Вуаля: https://psalm.dev/r/8c9ab50ba2.
Я имею в виду, конечно, статанализ. Очевидно, Psalm не знает, что в резалт сете имеются ключи
'question_id'
и 'title'
, и потому генерирует ошибку. Наша задача максимально деликатно ему помочь и явно прописать тип как можно ближе к "источнику".Ещё вчера стаб для
PDOStatement
был неполным, но сегодня Мэттью смерджил мой PR, и теперь можно дополнить сниппет соответствующим phpdoc. Напоминаю, что необязательно указывать имя переменной в @var
, если аннотируется ближайшее выражение справа.Вуаля: https://psalm.dev/r/8c9ab50ba2.
🎙 22 апреля на первой Dats.Conf я расскажу, как структурировать код, чтобы не получить «большой ком грязи»
А пока приглашаю вас посмотреть интервью, которое в преддверии митапа у меня взял уже знакомый вам Виктор Большаков.
https://youtu.be/1ckezPnndNM
А пока приглашаю вас посмотреть интервью, которое в преддверии митапа у меня взял уже знакомый вам Виктор Большаков.
https://youtu.be/1ckezPnndNM
YouTube
Dats.Conf / Интервью с Валентином Удальцовым
PHP-митап в формате брейншторма со спикерами. 22 апреля в 19:00 встречаемся в формате офлайн, по адресу: Большая Якиманка, 26.
Валентин Удальцов - Team lead в Happy Inc и автор канала «Пых» расскажет о том, как структурировать код, чтобы не получить “большой…
Валентин Удальцов - Team lead в Happy Inc и автор канала «Пых» расскажет о том, как структурировать код, чтобы не получить “большой…
🎤 Сегодня я выступаю в Нижнем на митапе про организацию кода!
В 11:10 Денис Юрьев (Skysmart от Skyeng) расскажет, как переделать Symfony-проект в целое направление.
В 12:05 я расскажу, как структурировать код, чтобы не получить «большой ком грязи». Обсудим разные подходы к структурированию, принципы проектирования пакетов и инструменты для контроля.
Если вы в Нижнем, то приходите в Лекторий Правда, если нет — подключайтесь к трансляции на канале PHP Point!
https://youtu.be/SycSx0Qp3eg?t=3876
В 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-проект в целое…
00:00 Интро
06:10 Метания ядра или как превратить Symfony-проект в целое…
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 (
• соответствие типов инъекций контейнера Symfony (
• депрекации сервисов и конфигов Symfony (
• маппинг Doctrine и соответствие ему схемы БД (
• конфигурация Doctrine для production (
• связность/зацепление и направление зависимостей (Deptrac, dePHPend),
• ну и конечно же, тесты!
Также обратите внимание на репозиторий Static analysis tools for PHP и доклад 25+ инструментов для аудита кода.
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+ инструментов для аудита кода.
API Payload Naming Convention
Всё очень просто: чем меньше трансформаций, тем лучше.
Например, вы проектируете API для сервиса на PHP. Ваши потенциальные клиенты — фронт на TypeScript, приложение для Android на Kotlin и приложение для iPhone на Swift. Беглым гуглением выясняем, что все четверо для свойств объектов используют camelCase. Стоит ли выбирать snake_case? Нет.
Только в случае легаси API имеет смысл дальше строгать эндпойнты в том же стиле, чтобы избежать винегрета.
Всё очень просто: чем меньше трансформаций, тем лучше.
Например, вы проектируете API для сервиса на PHP. Ваши потенциальные клиенты — фронт на TypeScript, приложение для Android на Kotlin и приложение для iPhone на Swift. Беглым гуглением выясняем, что все четверо для свойств объектов используют camelCase. Стоит ли выбирать snake_case? Нет.
Только в случае легаси API имеет смысл дальше строгать эндпойнты в том же стиле, чтобы избежать винегрета.
Какой стиль именования используете для API на текущем проекте?
Anonymous Poll
62%
camelCase
24%
snake_case
2%
PascalCase
13%
kebab-case
PHP Дайджест Стрим #202-204
Сегодня вечером на канале PHP Point пробегусь по трём весенним PHP Дайджестам. Начало, как обычно, в
https://youtu.be/DYNbjSTjwPk
Сегодня вечером на канале PHP Point пробегусь по трём весенним PHP Дайджестам. Начало, как обычно, в
20:00
, всех жду!https://youtu.be/DYNbjSTjwPk
YouTube
PHP Digest Live #202-204. First-class callable syntax и другие новости PHP 8.1, Symfony 5.3
Обсудим два RFC про callable (Partial Function Application и First-class callable syntax), аксессоры свойств и другие новости вокруг PHP 8.1. Посмотрим, как Doctrine и Symfony добавляют поддержку атрибутов. Пробежимся по верхам трёх весенних дайджестов.…
Продвинутая интерполяция
Иногда в длинную строку нужно подставить константы / статические свойства или результаты функций / статических методов.
Первой на ум приходит интерполяция, но в PHP она невозможна без переменной, даже при использовании фигурных скобок. То есть вот так нельзя:
Костыль Выход есть! Присвоим переменной имя функции
Если пойти чуть дальше и обернуть
https://3v4l.org/DogHB
Иногда в длинную строку нужно подставить константы / статические свойства или результаты функций / статических методов.
Первой на ум приходит интерполяция, но в 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
🎙 PHP Russia 2021
Два года назад я дебютировал на PHP Russia с митапом Как контрибьютить в Symfony и зачем это делать.
В этом году у меня полноценный доклад Thesis: как забыть про ORM и перейти на нативные SQL-запросы с очень интересной повесткой! Всех жду, в первую очередь оффлайн в Москве.
По промокоду PHPforFriends можно сэкономить 7% на билетах.
https://phprussia.ru/moscow/2021/abstracts/7654
Два года назад я дебютировал на PHP Russia с митапом Как контрибьютить в Symfony и зачем это делать.
В этом году у меня полноценный доклад Thesis: как забыть про ORM и перейти на нативные SQL-запросы с очень интересной повесткой! Всех жду, в первую очередь оффлайн в Москве.
По промокоду PHPforFriends можно сэкономить 7% на билетах.
https://phprussia.ru/moscow/2021/abstracts/7654
Telegram
PHP Russia Channel
💥Есть случаи, когда отказаться от ORM — правильное решение. Но страдать совершенно не хочется. Хочется удобно.
На PHP Russia 2021 Валентин Удальцов покажет, как писать почти чистый SQL и не потерять большинства плюсов ORM.
В докладе Валентин поделится…
На PHP Russia 2021 Валентин Удальцов покажет, как писать почти чистый SQL и не потерять большинства плюсов ORM.
В докладе Валентин поделится…
❤️ PHP Russia 2021
В понедельник прошла конференция PHP Russia. В том, что она состоялась сейчас, на гребне второй волны, огромная заслуга организаторов. Подход был настолько серьёзным, насколько это можно себе представить.
Я не мог приехать к началу и остаться на афтерпати, но даже несколько часов на площадке были кромешным кайфом. Как спикер я оценил техническую подготовку — всё было быстро, уверенно и качественно. Как участник — организацию, атмосферу и программу.
Огромное спасибо @samdark, @Halfnomad и @pronskiy за глубокое понимание и поддержку! С таким программным комитетом можно успешно выступить прямо в аду.
А ещё я был рад видеть вас, подписчиков, в зале! Легко и приятно на сцене, когда с половиной аудитории ты давно в диалоге.
Я счастлив как слон, до встречи на следующей конференции! 🤗
В понедельник прошла конференция PHP Russia. В том, что она состоялась сейчас, на гребне второй волны, огромная заслуга организаторов. Подход был настолько серьёзным, насколько это можно себе представить.
Я не мог приехать к началу и остаться на афтерпати, но даже несколько часов на площадке были кромешным кайфом. Как спикер я оценил техническую подготовку — всё было быстро, уверенно и качественно. Как участник — организацию, атмосферу и программу.
Огромное спасибо @samdark, @Halfnomad и @pronskiy за глубокое понимание и поддержку! С таким программным комитетом можно успешно выступить прямо в аду.
А ещё я был рад видеть вас, подписчиков, в зале! Легко и приятно на сцене, когда с половиной аудитории ты давно в диалоге.
Я счастлив как слон, до встречи на следующей конференции! 🤗
phprussia.ru
Крупнейшая конференция по PHP в России 2021