#[<T>] Дженерики через атрибуты
Роман Пронский в своём блоге предлагает реализовать стираемые дженерики путём расширения синтаксиса атрибутов.
Ход мысли такой. Сейчас мы описываем общие типы для Psalm и PHPStan в phpdoc-ах, то есть, по сути, и используем стираемые дженерики, только с не особо стандартизованным синтаксисом и в комментариях, КАРЛ. А ещё у нас есть атрибуты — синтаксис в PHP, предназначенный для метаинформации. Так почему бы нам не объединить две эти вещи? Так как атрибуты в текущем виде слабо подходят для типизации, Рома предлагает расширить их синтаксис, в частности, разрешить ставить атрибуты над выражениями и перед типом возвращаемого значения.
https://pronskiy.com/blog/generics-via-attributes-in-php/
Я считаю, что это интересный альтернативный взгляд на дженерики в PHP, но с ним связано несколько проблем:
1. Нарушение принципа единой отвественности для атрибутов. Мы либо получим неоднозначность в определении понятия "атрибут", либо просто дженерики с похожим синтаксисом.
2. Инстанциированные атрибуты можно получить только через рефлексию. Рефлексия — это рантайм и автолоадинг. Статанализ же в идеале вообще не должен запускать анализируемый код. Именно поэтому появились такие проекты, как PHP Parser и Better Reflection. Если же обновлённые атрибуты будут использоваться только как синтаксис, то нет смысла их называть атрибутами.
3. Приведенную в статье декларацию атрибута-дженерика над выражением вообще не получится отрефлексировать, поскольку для выражений по определению невозможна рефлексия. Из-за этого синтаксис дженериков может быть реализован только на уровне языка.
Получается, что замаскированные под атрибуты дженерики технически не смогут ими быть. Ну а в таком случае проще реализовать стираемые дженерики с привычным синтаксисом
Что касается самой концепции стираемых дженериков, я её однозначно поддерживаю. Да, такой подход требует наличия внешнего анализатора, но взамен даёт стандартизированный синтаксис, нативный парсинг кода с дженериками и популяризацию обобщённого программирования среди PHP-разработчиков.
Я очень рад, что Рома в очередной раз подогрел дискуссию вокруг дженериков. Любой подобный движ полезен для сообщества и приближает нас к результату.
Роман Пронский в своём блоге предлагает реализовать стираемые дженерики путём расширения синтаксиса атрибутов.
Ход мысли такой. Сейчас мы описываем общие типы для Psalm и PHPStan в phpdoc-ах, то есть, по сути, и используем стираемые дженерики, только с не особо стандартизованным синтаксисом и в комментариях
https://pronskiy.com/blog/generics-via-attributes-in-php/
Я считаю, что это интересный альтернативный взгляд на дженерики в PHP, но с ним связано несколько проблем:
1. Нарушение принципа единой отвественности для атрибутов. Мы либо получим неоднозначность в определении понятия "атрибут", либо просто дженерики с похожим синтаксисом.
2. Инстанциированные атрибуты можно получить только через рефлексию. Рефлексия — это рантайм и автолоадинг. Статанализ же в идеале вообще не должен запускать анализируемый код. Именно поэтому появились такие проекты, как PHP Parser и Better Reflection. Если же обновлённые атрибуты будут использоваться только как синтаксис, то нет смысла их называть атрибутами.
3. Приведенную в статье декларацию атрибута-дженерика над выражением вообще не получится отрефлексировать, поскольку для выражений по определению невозможна рефлексия. Из-за этого синтаксис дженериков может быть реализован только на уровне языка.
Получается, что замаскированные под атрибуты дженерики технически не смогут ими быть. Ну а в таком случае проще реализовать стираемые дженерики с привычным синтаксисом
array<string, object>. Если же по каким-то техническим причинам необходимо оборачивать декларации в #[], то пусть это просто будут дженерики с таким синтаксисом.Что касается самой концепции стираемых дженериков, я её однозначно поддерживаю. Да, такой подход требует наличия внешнего анализатора, но взамен даёт стандартизированный синтаксис, нативный парсинг кода с дженериками и популяризацию обобщённого программирования среди PHP-разработчиков.
Я очень рад, что Рома в очередной раз подогрел дискуссию вокруг дженериков. Любой подобный движ полезен для сообщества и приближает нас к результату.
Pronskiy
Generics via Attributes in PHP — Can We Have Them?
Roman Pronskiy
👍43👎12🤔5🔥2🤩1
🔴 PHP-линч #2
Сегодня вечером на канале PHP Point пройдёт второй линч!
Жду вас на час позже, в 19 МСК, с заготовленными для ревью библиотеками и проектами.
https://youtu.be/Hi167txLIyk
Сегодня вечером на канале PHP Point пройдёт второй линч!
Жду вас на час позже, в 19 МСК, с заготовленными для ревью библиотеками и проектами.
https://youtu.be/Hi167txLIyk
YouTube
PHP-линч #2 • infobip/infobip-api-php-client • klimick/decode • Nex-Otaku/minimal-filesystem
00:00 Вступление
03:52 infobip/infobip-api-php-client
19:37 klimick/decode
44:52 Nex-Otaku/minimal-filesystem
56:38 Испужался ревьюить мою хрень!
Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console.…
03:52 infobip/infobip-api-php-client
19:37 klimick/decode
44:52 Nex-Otaku/minimal-filesystem
56:38 Испужался ревьюить мою хрень!
Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console.…
🔥42👍10
Сколько, по вашему мнению, я, Валентин, стою как PHP-разработчик и тимлид в рублях в месяц?
Anonymous Poll
15%
200к
8%
250к
16%
300к
17%
350к
15%
400к
8%
450к
21%
БОЛЬШЕ!!!
Forwarded from PHP Russia Channel
ID-баттл: UUID vs автоинкремент обсудим с Валентином Удальцовым
⠀
📋 https://bx.vc/ek7oa2
⠀
Почти восемь лет, занимаясь разработкой веб-приложений, Валентин использовал для идентификации исключительно автоинкременты. И только 3,5 года назад он попробовал UUID в одном пет-проекте. С тех пор он и его команда в Happy Inc. почти всегда выбирают UUID для идентификации чего бы то ни было. Они научились коррелировать сущности разных модулей по идентификатору, пользоваться преимуществами разных типов UUID, одними из первых внедрили UUID v6.
Валентин обобщит опыт его команды и разложит по полочкам все “за” и “против” использования UUID и автоинкрементов в PHP-приложении. Обсудим актуальные способы генерации и хранения идентификаторов, изучим бенчмарки для разных сценариев и баз данных и подведём новую черту с пометкой "2022" под этим старым добрым холиваром.
Встречаемся 24 и 25 ноября на PHP Russia 2022, которая пройдет в рамках HighLoad++ 2022 🖐
⠀
✅ Программа конференции и билеты здесь - https://bx.vc/ca1xqj
⠀
📋 https://bx.vc/ek7oa2
⠀
Почти восемь лет, занимаясь разработкой веб-приложений, Валентин использовал для идентификации исключительно автоинкременты. И только 3,5 года назад он попробовал UUID в одном пет-проекте. С тех пор он и его команда в Happy Inc. почти всегда выбирают UUID для идентификации чего бы то ни было. Они научились коррелировать сущности разных модулей по идентификатору, пользоваться преимуществами разных типов UUID, одними из первых внедрили UUID v6.
Валентин обобщит опыт его команды и разложит по полочкам все “за” и “против” использования UUID и автоинкрементов в PHP-приложении. Обсудим актуальные способы генерации и хранения идентификаторов, изучим бенчмарки для разных сценариев и баз данных и подведём новую черту с пометкой "2022" под этим старым добрым холиваром.
Встречаемся 24 и 25 ноября на PHP Russia 2022, которая пройдет в рамках HighLoad++ 2022 🖐
⠀
✅ Программа конференции и билеты здесь - https://bx.vc/ca1xqj
👍43🔥16
🤯26👍12🔥10👎8🤔4
Варварский генератор
Недавно с коллегами обсудили, что, строго говоря, генератор не соблюдает принцип подстановки Барбары Лисков. Он кидает исключение при попытке перемотки после начала обхода и тем самым нарушает контракт
Понятно, почему конструктивно так сделали. Тем не менее передача генератора в функцию, которая принимаетWTF казусу, если она вполне законно пытается обойти аргумент больше одного раза.
Если очень хочется, чтобы инстанс генератора отрабатывал многократно, и при этом вы уверены, что это не приведёт к ненужным побочным эффектам, можно обернуть функцию, порождающую генератор, в
Вот как это будет работать: https://3v4l.org/46Evq.
Пишите в комментариях, где ещё PHP нарушает LSP.
Недавно с коллегами обсудили, что, строго говоря, генератор не соблюдает принцип подстановки Барбары Лисков. Он кидает исключение при попытке перемотки после начала обхода и тем самым нарушает контракт
Iterable, где такое поведение не предусмотрено.Понятно, почему конструктивно так сделали. Тем не менее передача генератора в функцию, которая принимает
Traversable или iterable, приводит к Если очень хочется, чтобы инстанс генератора отрабатывал многократно, и при этом вы уверены, что это не приведёт к ненужным побочным эффектам, можно обернуть функцию, порождающую генератор, в
RewindableGenerator:
/**
* @template TKey
* @template TValue
* @implements IteratorAggregate<TKey, TValue>
*/
final class RewindableGenerator implements IteratorAggregate
{
/**
* @param callable(): Generator<TKey, TValue> $generatorFunction
*/
public function __construct(private $generatorFunction) {}
public function getIterator(): Traversable
{
return ($this->generatorFunction)();
}
}
Вот как это будет работать: https://3v4l.org/46Evq.
Пишите в комментариях, где ещё PHP нарушает LSP.
👍25🔥6🤔5👎1
Пыхарь, используешь ли ты Rector?
Anonymous Poll
45%
Что?
38%
Слышал про такое, не пробовал.
5%
Использую только в pet-проектах.
3%
Пробовали на работе, не удалось внедрить. В комментариях расскажу, почему.
9%
Успешно используем в рабочем проекте.
👍9🔥3
Forwarded from Пятиминутка PHP
Релиз PHP 8.2 откладывается на 2 недели до 8 декабря из-за найденных в последний момент критических багов. Подробности: https://externals.io/message/118991
— Nov 24: PHP 8.2.0RC7
— Dec 8: PHP 8.2.0
— Dec 15: PHP 8.2.1RC1
— Jan 5: PHP 8.2.1 (in sync with 8.0/8.1)
— Nov 24: PHP 8.2.0RC7
— Dec 8: PHP 8.2.0
— Dec 15: PHP 8.2.1RC1
— Jan 5: PHP 8.2.1 (in sync with 8.0/8.1)
👍32🤔4
Сегодня PHP-линч, к сожалению, отменяется. Если буду успевать, встретимся на неделе. Если нет, то в следующую среду. Хорошего вечера!
👍31🤔4
Язык программирования PHP: рейтинг, сферы применения, прогнозы экспертов
Поделился своим мнением о судьбе PHP в блоге Хекслета.
https://ru.hexlet.io/blog/posts/zachem-izuchat-php-reyting-perspektivy-sfery-primeneniya
Поделился своим мнением о судьбе PHP в блоге Хекслета.
https://ru.hexlet.io/blog/posts/zachem-izuchat-php-reyting-perspektivy-sfery-primeneniya
ru.hexlet.io
PHP: подробно о языке, сферах применения, рейтинге
Рассказываем, зачем и где учить PHP, где его применяют, сколько зарабатывают PHP-разработчики, а также приводим мнения экспертов о перспективах и популярно...
🔥28👍13👎6🤔1
👍20🔥10👎5
PHP Russia 2022: ID-баттл: UUID vs автоинкремент
Пыхари, уже через полчаса я выступлю на PHP Russia, жду не дождусь своей очереди!
На сессии в частности расскажу, что существует 8 версий UUID, а не 5, и среди них есть куда более интересные и эффективные!
Всех, кто сегодня на площадке или оплатил онлайн-участие, приглашаю в зал P7. Для остальных скину доклад в Пых как только он будет доступен (организаторы говорят, что уже через пару недель нарежут 🥳).
Так или иначе, до встречи!
#HighLoadMoscow2022
Пыхари, уже через полчаса я выступлю на PHP Russia, жду не дождусь своей очереди!
На сессии в частности расскажу, что существует 8 версий UUID, а не 5, и среди них есть куда более интересные и эффективные!
Всех, кто сегодня на площадке или оплатил онлайн-участие, приглашаю в зал P7. Для остальных скину доклад в Пых как только он будет доступен (организаторы говорят, что уже через пару недель нарежут 🥳).
Так или иначе, до встречи!
#HighLoadMoscow2022
🔥105👍25👎4👏3
Мини-дайджест!
Зима начинается с крупных релизов, и я не могу о них молчать. Перечисляю ниже обновления проектов, которые сам использую, а вы дополните в комментариях, если вышло ещё что-то интересное.
Psalm 5
• intersection types,
• sealed array shapes,
• properties-of,
• variable templates,
•
• улучшение производительности и другие фичи, подробнее в статье их блога: https://psalm.dev/articles/psalm-5.
Я уже попробовал в выходные, пока релиз сыроват. На нашем рабочем проекте выкинул несколько странных ошибок, но они уже обсуждаются на гитхабе, так что жду фиксов. Всё равно очень круто, что эта версия вышла и что работа над инструментом продолжается!
Symfony 6.2
• Свои Lazy-Loading Proxies,
• улучшенная поддержка Emoji 🎉,
• Clock Component,
•
• UUID v7 and v8 в
• поддержка автокомплита для Zsh,
• наконец-то ручной логин/логаут из коробки (правда, в 2022 это уже не особо актуально),
• и ещё куча всего, изучайте https://symfony.com/blog/symfony-6-2-curated-new-features.
Rector 0.15
Очередная версия с несколькими новыми ректорами и наконец-то сайт getrector.org с документацией!
Зима начинается с крупных релизов, и я не могу о них молчать. Перечисляю ниже обновления проектов, которые сам использую, а вы дополните в комментариях, если вышло ещё что-то интересное.
Psalm 5
• intersection types,
• sealed array shapes,
• properties-of,
• variable templates,
•
@psalm-check-type,• улучшение производительности и другие фичи, подробнее в статье их блога: https://psalm.dev/articles/psalm-5.
Я уже попробовал в выходные, пока релиз сыроват. На нашем рабочем проекте выкинул несколько странных ошибок, но они уже обсуждаются на гитхабе, так что жду фиксов. Всё равно очень круто, что эта версия вышла и что работа над инструментом продолжается!
Symfony 6.2
• Свои Lazy-Loading Proxies,
• улучшенная поддержка Emoji 🎉,
• Clock Component,
•
#[Assert\When],• UUID v7 and v8 в
symfony/uid (наверное, мой доклад посмотрели 😅),• поддержка автокомплита для Zsh,
• наконец-то ручной логин/логаут из коробки (правда, в 2022 это уже не особо актуально),
• и ещё куча всего, изучайте https://symfony.com/blog/symfony-6-2-curated-new-features.
Rector 0.15
Очередная версия с несколькими новыми ректорами и наконец-то сайт getrector.org с документацией!
psalm.dev
Announcing Psalm 5
Read this announcement in Ukrainian, French or Italian.
We all wish we could go back in time, whether it’s to right some historic wrong, tell a…
We all wish we could go back in time, whether it’s to right some historic wrong, tell a…
👍37🔥22👎1
Пых
Мини-дайджест! Зима начинается с крупных релизов, и я не могу о них молчать. Перечисляю ниже обновления проектов, которые сам использую, а вы дополните в комментариях, если вышло ещё что-то интересное. Psalm 5 • intersection types, • sealed array shapes…
What's up, PHP? #1
Скопилось приличное количество новостей и релизов, очень хочется их обсудить. Поэтому сегодня вместо линча в
Поскольку рубрика "PHP Дайджест Live" не может продолжаться без участия Ромы, я запускаю альтернативную: "What's up, PHP?" Попробуем это название. Если есть идеи, как можно смачно русифицировать, пишите в комментариях.
https://youtu.be/X2XjaF4PJvk
Скопилось приличное количество новостей и релизов, очень хочется их обсудить. Поэтому сегодня вместо линча в
19:00 мы поговорим про Psalm 5, Symfony 6.2 и PSR-20!Поскольку рубрика "PHP Дайджест Live" не может продолжаться без участия Ромы, я запускаю альтернативную: "What's up, PHP?" Попробуем это название. Если есть идеи, как можно смачно русифицировать, пишите в комментариях.
https://youtu.be/X2XjaF4PJvk
YouTube
What's up, PHP? #1
Альтернативная новостная рубрика на PHP Point!
Подписывайтесь на наши каналы в Telegram:
• Пых https://news.1rj.ru/str/phpyh,
• PHP Digest https://news.1rj.ru/str/phpdigest,
• PHP умирает?! https://news.1rj.ru/str/isPHPdying.
Поддержите канал на Boosty: https://boosty.to/phpyh.
Подписывайтесь на наши каналы в Telegram:
• Пых https://news.1rj.ru/str/phpyh,
• PHP Digest https://news.1rj.ru/str/phpdigest,
• PHP умирает?! https://news.1rj.ru/str/isPHPdying.
Поддержите канал на Boosty: https://boosty.to/phpyh.
👍40👏9🔥7
🎉 С днём рождения, samdark! 🎁
Сегодня день рождения у Александра Макарова. Меня в Саше восхищают его предприимчивость, энтузиазм и успешность: он и лидер команды Yii, и организатор PHP Russia, и член рабочей группы PSR-12, и контрибьютор кучи проектов, и автор блога и даже книги. Я обнаружил одну удивительную закономерность: если где-то в мире проходит какой-то митап (не важно, оффлайн или онлайн), то с вероятностью 95% Саша принимает в нём участие.
Саш, с днём рождения! Спасибо тебе за гигантский вклад в PHP!
Кстати, подписывайтесь на новый Сашин блог в телеге: @samdark_blog.
Сегодня день рождения у Александра Макарова. Меня в Саше восхищают его предприимчивость, энтузиазм и успешность: он и лидер команды Yii, и организатор PHP Russia, и член рабочей группы PSR-12, и контрибьютор кучи проектов, и автор блога и даже книги. Я обнаружил одну удивительную закономерность: если где-то в мире проходит какой-то митап (не важно, оффлайн или онлайн), то с вероятностью 95% Саша принимает в нём участие.
Саш, с днём рождения! Спасибо тебе за гигантский вклад в PHP!
Кстати, подписывайтесь на новый Сашин блог в телеге: @samdark_blog.
🎉263👍36🔥12👎6🤔3
Вместе встречаем PHP 8.2!
Ни года без релизного стрима!
В пятницу (9 декабря) в
Подключайтесь!
https://youtu.be/cXdJxa2gxgo
Ни года без релизного стрима!
В пятницу (9 декабря) в
19:00 Александр Макаров, Владлен Гилязетдинов и я, Валентин Удальцов, соберёмся на канале PHP Point, чтобы обсудить новый PHP. Поговорим про фичи, успехи PHP Foundation и подведём итоги уходящего года в сообществе.Подключайтесь!
https://youtu.be/cXdJxa2gxgo
YouTube
Релиз PHP 8.2, запуск опроса с итогами года в сообществе и не только
Опрос по итогам 2022 в русскоязычном PHP-сообществе: https://forms.gle/LSbuuTezfqboonRV9. При желании в конце можно оставить почту — волей рандома подарим кому-нибудь PHP-слона и классный мерч!
Итоги опроса, в том числе подборки лучших статей, докладов и…
Итоги опроса, в том числе подборки лучших статей, докладов и…
👍65🎉14🔥4❤1🤔1
🔴 Начинаем стрим по PHP 8.2!
Подключайтесь и встречайте новый PHP вместе с нами!
https://youtu.be/cXdJxa2gxgo
Картинка из поста в светлом и тёмном вариантах!
Подключайтесь и встречайте новый PHP вместе с нами!
https://youtu.be/cXdJxa2gxgo
Картинка из поста в светлом и тёмном вариантах!
🔥24👍5
Пых
🔴 Начинаем стрим по PHP 8.2! Подключайтесь и встречайте новый PHP вместе с нами! https://youtu.be/cXdJxa2gxgo Картинка из поста в светлом и тёмном вариантах!
Обещанный опрос по итогам 2022 в русскоязычном PHP-сообществе!
При желании в конце можно оставить почту — волей рандома подарим кому-нибудь PHP-слона и классный мерч. Итоги опроса, в том числе подборки лучших статей, докладов и библиотек, появятся в начале года на сайте phpcommunity.ru.
https://forms.gle/LSbuuTezfqboonRV9
При желании в конце можно оставить почту — волей рандома подарим кому-нибудь PHP-слона и классный мерч. Итоги опроса, в том числе подборки лучших статей, докладов и библиотек, появятся в начале года на сайте phpcommunity.ru.
https://forms.gle/LSbuuTezfqboonRV9
Google Docs
Привет! Подводим итоги 2022 в русскоязычном PHP-сообществе.
Результаты опубликуем в конце января / начале февраля на phpcommunity.ru. При желании в конце можно оставить почту — волей рандома подарим кому-нибудь PHP-слона и классный мерч.
Кстати, здесь можно посмотреть итоги за 2021.
Кстати, здесь можно посмотреть итоги за 2021.
👍17🔥2