Какой стиль именования используете для 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
#[Route(name: self::class)]
Лайфхак для симфонистов. Если вы размещаете каждый экшн в отдельном invokable классе, то его имя можно использовать в качестве имени роута.
При таком подходе не нужно соблюдать никакие конвенции именования и хардкодить строки.
Работает и с атрибутами, и с аннотациями, однако в аннотациях нельзя использовать self, только само имя класса. На скрине оба примера.
Лайфхак для симфонистов. Если вы размещаете каждый экшн в отдельном invokable классе, то его имя можно использовать в качестве имени роута.
При таком подходе не нужно соблюдать никакие конвенции именования и хардкодить строки.
Работает и с атрибутами, и с аннотациями, однако в аннотациях нельзя использовать self, только само имя класса. На скрине оба примера.
LSP для конструктора
Иногда в базовом классе мы хотим предложить статическую фабрику. Чтобы она работала корректно, конструкторы подклассов должны соблюдать LSP. Есть два варианта, как это гарантировать.
1️⃣ Зафиналить конструктор в базовом классе. Минус в том, что мы не сможем инициализировать состояние в подклассе. Можно, конечно, добавить в базовый класс костыль в виде метода
2️⃣ Попросить Psalm проверять LSP для
https://psalm.dev/docs/running_psalm/issues/UnsafeInstantiation/
__construct — особенный метод класса в PHP. В частности, он не подчиняется LSP, то есть в подклассе сигнатура конструктора может быть изменена как угодно. Это удобно в большинстве случаев, но не всегда.Иногда в базовом классе мы хотим предложить статическую фабрику. Чтобы она работала корректно, конструкторы подклассов должны соблюдать LSP. Есть два варианта, как это гарантировать.
1️⃣ Зафиналить конструктор в базовом классе. Минус в том, что мы не сможем инициализировать состояние в подклассе. Можно, конечно, добавить в базовый класс костыль в виде метода
initialize, но есть решение поэлегантнее.2️⃣ Попросить Psalm проверять LSP для
__construct при помощи @psalm-consistent-constructor. Если конструктор подкласса не будет соблюдать сигнатуру, Psalm выбросит ConstructorSignatureMismatch.https://psalm.dev/docs/running_psalm/issues/UnsafeInstantiation/
Кодишь 2.0
Мама, я в телевизоре!
Большое спасибо организаторам конференции Кодишь 2.0 за приглашение и отличные выходные в Брянске!
https://youtu.be/tBgpNqkoN_k
P.S. Thesis ну прям очень скоро будет, в поезде многое доделал.
Мама, я в телевизоре!
Большое спасибо организаторам конференции Кодишь 2.0 за приглашение и отличные выходные в Брянске!
https://youtu.be/tBgpNqkoN_k
P.S. Thesis ну прям очень скоро будет, в поезде многое доделал.
Тесты должны быть независимыми
Юнит-тесты должны быть независимыми по определению. Всё необходимое инициализируется в блоке Arrange и утилизируется из памяти после Assert. Использовать в юнитах
Тесты, работающие с общим состоянием, должны после выполнения возвращать его в исходную точку. Для этого можно использовать in-memory хранилища или откатывать транзакции.
Чтобы защитить себя от неявных зависимостей между тестами, следует запускать их в случайном порядке. Для этого прописываем
Юнит-тесты должны быть независимыми по определению. Всё необходимое инициализируется в блоке Arrange и утилизируется из памяти после Assert. Использовать в юнитах
setUp / tearDown я не рекомендую.Тесты, работающие с общим состоянием, должны после выполнения возвращать его в исходную точку. Для этого можно использовать in-memory хранилища или откатывать транзакции.
Чтобы защитить себя от неявных зависимостей между тестами, следует запускать их в случайном порядке. Для этого прописываем
<phpunit executionOrder="random"> в phpunit.xml или выполняем phpunit с флагом --order-by=random.
Пых
Photo
?-> вместо NullObject: по следам дискуссии
Предыдущий пост бурно и полезно обсудили, расписываю основные мысли.
"За" и "против" использования
➕ самый лаконичный способ до выхода PHP 8.1 (там можно будет использовать new для значений параметров по умолчанию);
➕ обходится дешевле в рантайме, так как в null-сценарии выполняется меньше кода (сразу оговорюсь, что это вообще сомнительный аргумент, в частности, трудно себе представить приложение без логгирования в продакшне);
➖ скрытый и "ненужный"
➖ NullObject — более корректное и универсальное с точки зрения ООП решение, null-safe подход может быть уместен только в нескольких случаях;
➖ на проекте без статического анализатора вероятность ошибки выше.
Также в Пыхтелке затронули очень важную тему: зависимости редко бывают опциональными. Действительно, nullable зависимости часто сигнализируют о нарушении SRP. Необязательные поведения лучше оформлять в виде декораторов или middleware — их легко включать и выключать, не изменяя код (см. OCP).
Что касается логгирования, его не всегда можно представить в виде декоратора. Зачастую полезная для логов информация инкапсулирована в реализации и не протекает через контракт. Скорее всего, в этом случае тоже где-то нарушается SRP, но добавление абстракции исключительно ради логгирования может быть неоправданным усложнением.
И последний нюанс: зачем вообще делать логгер опциональной зависимостью, если он всегда есть в контейнере? Мой ответ простой: лень. В юнит-тестах, не тестирующих само логгирование, не хочется каждый раз писать
Итак, теперь мы знаем, что можно вот так нестандартно использовать
Предыдущий пост бурно и полезно обсудили, расписываю основные мысли.
"За" и "против" использования
?-> для опциональных зависимостей:➕ самый лаконичный способ до выхода PHP 8.1 (там можно будет использовать new для значений параметров по умолчанию);
➕ обходится дешевле в рантайме, так как в null-сценарии выполняется меньше кода (сразу оговорюсь, что это вообще сомнительный аргумент, в частности, трудно себе представить приложение без логгирования в продакшне);
➖ скрытый и "ненужный"
if;➖ NullObject — более корректное и универсальное с точки зрения ООП решение, null-safe подход может быть уместен только в нескольких случаях;
➖ на проекте без статического анализатора вероятность ошибки выше.
Также в Пыхтелке затронули очень важную тему: зависимости редко бывают опциональными. Действительно, nullable зависимости часто сигнализируют о нарушении SRP. Необязательные поведения лучше оформлять в виде декораторов или middleware — их легко включать и выключать, не изменяя код (см. OCP).
Что касается логгирования, его не всегда можно представить в виде декоратора. Зачастую полезная для логов информация инкапсулирована в реализации и не протекает через контракт. Скорее всего, в этом случае тоже где-то нарушается SRP, но добавление абстракции исключительно ради логгирования может быть неоправданным усложнением.
И последний нюанс: зачем вообще делать логгер опциональной зависимостью, если он всегда есть в контейнере? Мой ответ простой: лень. В юнит-тестах, не тестирующих само логгирование, не хочется каждый раз писать
new Service(/** required dependencies, */ new NullLogger()) ☺️.Итак, теперь мы знаем, что можно вот так нестандартно использовать
?->, но что это не всегда хорошая идея. Всем спасибо за комментарии!🔴 PHP 8.1 уже в эфире, подключайтесь!
https://youtu.be/5D337gaVPa4
Репо с кодом, который я показывал: https://github.com/vudaltsov/php81.
https://youtu.be/5D337gaVPa4
Репо с кодом, который я показывал: https://github.com/vudaltsov/php81.
YouTube
Релиз PHP 8.1, запуск PHP Foundation и истории переезда на 8.0
Обсудим апдейты нового релиза и новость о создании PHP Foundation — фонда в поддержку языка. А еще послушаем, как ребята из 4 компаний проекты на 8.0 перевозили: с чем столкнулись и что советуют.
https://opencollective.com/phpfoundation — о том, как поддержать…
https://opencollective.com/phpfoundation — о том, как поддержать…
Ищу к себе в команду middle/senior разработчика!
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.0 / PostgreSQL 14 / OpenAPI / CQRS / Event Sourcing / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, офис и удалёнка, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах.
У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.0 / PostgreSQL 14 / OpenAPI / CQRS / Event Sourcing / Psalm / Thesis и всё, о чём я тут рассказываю. 😜
Full-time, офис и удалёнка, ЗП по результатам собеса.
Резюме мне в ЛС @vudaltsov.
Happy INC
Экосистема digital платформ для понимания клиентов, проведения аудита компании, ее процессов, корпоративной культуры и настроя…
Опросник для персонала и клиентов со встроенными рекомендациями и инструментами для анализа. Гарантируем интересные и эффективные опросы для сотрудников - Happy...
👍9🔥1
Ночное образовательное шоу IT Nights 3.0
Приглашаю сегодня всех в 19:00 на IT Nights. Будут спикеры из Facebook, Яндекса, JetBrains, VK, X5 Group.
Меня заинтриговал доклад Изменения — единственная константа в IT и рыцарский турнир, в котором примут участия ребята с Podlodka, Егор Толстой и Стас Цыганов.
По промокоду
Приглашаю сегодня всех в 19:00 на IT Nights. Будут спикеры из Facebook, Яндекса, JetBrains, VK, X5 Group.
Меня заинтриговал доклад Изменения — единственная константа в IT и рыцарский турнир, в котором примут участия ребята с Podlodka, Егор Толстой и Стас Цыганов.
По промокоду
phpyh скидка 20%.Какой вариант оптимальнее по памяти? (Какая переменная меньше?)
Anonymous Quiz
45%
Первый ($toStringAsKeyMemory)
55%
Второй ($toHexAsKeyMemory)
🔥8
📊 Итоги года
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouseчто это?, Дайджест Live. Запустили канал с мемесами PHP умирает?!
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопросвека репортёра: «Скажите, за базами данных будущее?»
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!Yii3 ведь тоже не вышел. Недавно уделил либе несколько дней в отпуске и решил пару организационно-архитектурных проблем. Обещать ничего не буду, просто скажу, что идея жива и мы по-прежнему радостно используем Thesis на работе.
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться.
Ачивки
💡 Попробовали с Ромой новые форматы: интервью, Clubhouse
🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России!
🤣 Меня показали по телеку, и там я ответил на главный вопрос
🧑🎨 Пых получил свой логотип.
👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое!
😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont.
🔥 Вошёл в программный комитет PHP Russia 2022.
Фейлы
☹️ Нерелиз Thesis. Но я не отчаиваюсь!
Всем спасибо за участие в сообществе, до встречи в 🐯 году!
Пройдите, пожалуйста, опрос — он наводит мост в 2022!
https://phpsurvey.typeform.com/to/fqX8iwnT
Typeform
Explore Typeform | Create your own surveys, quizzes, forms
Experience a slick way of creating forms with Typeform. Try templates for quizzes, surveys, forms and more.
👍7🔥4
Организация миграций Doctrine
В Doctrine Migrations есть классный параметр
Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
В Doctrine Migrations есть классный параметр
organize_migrations. Он позволяет группировать файлы миграций по годам (BY_YEAR) или по годам и месяцам (BY_YEAR_AND_MONTH). Рекомендую сразу переходить на BY_YEAR_AND_MONTH.Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный
Version{date} нейминг миграций.https://symfony.com/bundles/DoctrineMigrationsBundle/3.2.x/index.html
https://www.doctrine-project.org/projects/doctrine-migrations/en/3.3/reference/configuration.html
👍67🔥42