Обложка канала

Пых. Страница 4

4468 @phpyh

Блог @vudaltsov о разработке на PHP

  • Пых

    What's up, PHP? #1 Скопилось приличное количество новостей и релизов, очень хочется их обсудить. Поэтому сегодня вместо линча в 19:00 мы поговорим про Psalm 5, Symfony 6.2 и PSR-20! Поскольку рубрика "PHP Дайджест Live" не может продолжаться без участия Ромы, я запускаю альтернативную: "What's up, PHP?" Попробуем это название. Если есть идеи, как можно смачно русифицировать, пишите в комментариях. https://youtu.be/X2XjaF4PJvk
    What's up, PHP? #1

    Альтернативная новостная рубрика на PHP Point! Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Пых

    Мини-дайджест! Зима начинается с крупных релизов, и я не могу о них молчать. Перечисляю ниже обновления проектов, которые сам использую, а вы дополните в комментариях, если вышло ещё что-то интересное. 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 это уже не особо актуально), • и ещё куча всего, изучайте symfony.com/blog/sy…features. Rector 0.15 Очередная версия с несколькими новыми ректорами и наконец-то сайт getrector.org с документацией!
    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…

    psalm.dev
  • Пых

    PHP-линч #5

    Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console. Как устроен PHP-линч: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Все линчи всегда записываются, так что не переживайте, если не успеваете присоединиться в процессе. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Реклама

  • Пых

    PHP Russia 2022: ID-баттл: UUID vs автоинкремент Пыхари, уже через полчаса я выступлю на PHP Russia, жду не дождусь своей очереди! На сессии в частности расскажу, что существует 8 версий UUID, а не 5, и среди них есть куда более интересные и эффективные! Всех, кто сегодня на площадке или оплатил онлайн-участие, приглашаю в зал P7. Для остальных скину доклад в Пых как только он будет доступен (организаторы говорят, что уже через пару недель нарежут 🥳). Так или иначе, до встречи! #HighLoadMoscow2022
  • Пых

    PHP-линч #4

    Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console. Как устроен PHP-линч: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Все линчи всегда записываются, так что не переживайте, если не успеваете присоединиться в процессе. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Пых

    Язык программирования PHP: рейтинг, сферы применения, прогнозы экспертов Поделился своим мнением о судьбе PHP в блоге Хекслета. ru.hexlet.io/blog/po…meneniya
    Зачем изучать PHP: рейтинг, перспективы, сферы применения

    В этой статье поговорим о PHP. Узнаем о перспективах и популярности этого языка в 2021 году, рассмотрим сферу применения, уровень зарплат и другие вопросы. Комментарии известных специалистов помогут развеять сомнения о целесообразности изучения PHP.

    ru.hexlet.io
  • Пых

    Сегодня 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)
  • Пых

    Варварский генератор Недавно с коллегами обсудили, что, строго говоря, генератор не соблюдает принцип подстановки Барбары Лисков. Он кидает исключение при попытке перемотки после начала обхода и тем самым нарушает контракт Iterable, где такое поведение не предусмотрено. Понятно, почему конструктивно так сделали. Тем не менее передача генератора в функцию, которая принимает Traversable или iterable, приводит к WTF казусу, если она вполне законно пытается обойти аргумент больше одного раза. Если очень хочется, чтобы инстанс генератора отрабатывал многократно, и при этом вы уверены, что это не приведёт к ненужным побочным эффектам, можно обернуть функцию, порождающую генератор, в 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.
    Принцип подстановки Барбары Лисков

    Принцип подстановки Барбары Лисков (англ. Liskov Substitution Principle, LSP) в объектно-ориентированном программировании является специфичным определением подтипа, предложенным Барбарой Лисков в 1987 году на конференции в основном докладе под названием Абстракция данных и иерархия .

    Wikipedia
  • Пых

    ⚠️ Линч переносится на полтора часа, будет сегодня в 19:30 по Москве. https://youtu.be/NODVKOhejEM
    PHP-линч #3

    Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console. Как устроен PHP-линч: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Все линчи всегда записываются, так что не переживайте, если не успеваете присоединиться в процессе. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Пых

    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
  • Пых

    🟥 PHP-линч #2 Сегодня вечером на канале PHP Point пройдёт второй линч! Жду вас на час позже, в 19 МСК, с заготовленными для ревью библиотеками и проектами. https://youtu.be/Hi167txLIyk
    PHP-линч #2

    Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console. Как устроен PHP-линч: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Все линчи всегда записываются, так что не переживайте, если не успеваете присоединиться в процессе. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Пых

    #[<T>] Дженерики через атрибуты Роман Пронский в своём блоге предлагает реализовать стираемые дженерики путём расширения синтаксиса атрибутов. Ход мысли такой. Сейчас мы описываем общие типы для Psalm и PHPStan в phpdoc-ах, то есть, по сути, и используем стираемые дженерики, только с не особо стандартизованным синтаксисом и в комментариях, КАРЛ. А ещё у нас есть атрибуты — синтаксис в PHP, предназначенный для метаинформации. Так почему бы нам не объединить две эти вещи? Так как атрибуты в текущем виде слабо подходят для типизации, Рома предлагает расширить их синтаксис, в частности, разрешить ставить атрибуты над выражениями и перед типом возвращаемого значения. pronskiy.com/blog/ge…s-in-php Я считаю, что это интересный альтернативный взгляд на дженерики в PHP, но с ним связано несколько проблем: 1. Нарушение принципа единой отвественности для атрибутов. Мы либо получим неоднозначность в определении понятия "атрибут", либо просто дженерики с похожим синтаксисом. 2. Инстанциированные атрибуты можно получить только через рефлексию. Рефлексия — это рантайм и автолоадинг. Статанализ же в идеале вообще не должен запускать анализируемый код. Именно поэтому появились такие проекты, как PHP Parser и Better Reflection. Если же обновлённые атрибуты будут использоваться только как синтаксис, то нет смысла их называть атрибутами. 3. Приведенную в статье декларацию атрибута-дженерика над выражением вообще не получится отрефлексировать, поскольку для выражений по определению невозможна рефлексия. Из-за этого синтаксис дженериков может быть реализован только на уровне языка. Получается, что замаскированные под атрибуты дженерики технически не смогут ими быть. Ну а в таком случае проще реализовать стираемые дженерики с привычным синтаксисом array<string, object>. Если же по каким-то техническим причинам необходимо оборачивать декларации в #[], то пусть это просто будут дженерики с таким синтаксисом. Что касается самой концепции стираемых дженериков, я её однозначно поддерживаю. Да, такой подход требует наличия внешнего анализатора, но взамен даёт стандартизированный синтаксис, нативный парсинг кода с дженериками и популяризацию обобщённого программирования среди PHP-разработчиков. Я очень рад, что Рома в очередной раз подогрел дискуссию вокруг дженериков. Любой подобный движ полезен для сообщества и приближает нас к результату.
  • Пых

    $reflectionPromotedProperty->hasDefaultValue()
    final class A
    {
        public function __construct(
            public string $a = 'default',
        ) {}
    }
    $property = new ReflectionProperty(A::class, 'a');
    var_dump($property->hasDefaultValue()); // false
    
    Довольно контринтуитивно, что этот код выведет false. Однако если развернуть promoted свойство в обычное, станет понятно, почему:
    final class A
    {
        public string $a;
    
        public function __construct(
            string $a = 'default',
        ) {
            $this->a = $a;
        }
    }
    $parameter = new ReflectionParameter([A::class, '__construct'], 'a');
    var_dump($parameter->isDefaultValueAvailable()); // true
    
    Дефолтное значение имеет не свойство, а параметр конструктора! Как следствие, вот такой код
    $class = new ReflectionClass(A::class);
    $a = $class->newInstanceWithoutConstructor();
    var_dump($a->a);
    
    выбросит Typed property A::$a must not be accessed before initialization. https://3v4l.org/kkf24
  • Пых

    🩸 Буквально через 5 минут начнётся первый в мире PHP-линч! 🎉 В честь дебюта проекта я разыграю два билета на Podlodka PHP Crew! Один из них вручу тому, кто скинет на ревью самый полезный и интересный проект. Второй билет получит наиболее активный участник чата трансляции. Подключайтесь! https://youtu.be/MwMCzqvCGKo Update. В трансляцию добавлены эпизоды, автору shoman4eg/moy-nalog и Alex D вручены билеты!
    Онлайн-конференция Podlodka PHP Crew, сезон #1

    Недельное мероприятие от команды Podlodka: ежедневные интерактивные сессии в Zoom по актуальным вопросам PHP-индустрии, нон-стоп общение с экспертами и звёздами индустрии, закрытое профессиональное сообщество в Slack.

    podlodka.io
  • Реклама

  • Пых

    🔨 Первый в мире PHP-линч! После нашей субботней встречи у меня появилась идея комментировать PHP-код на постоянной основе. Должно получиться пхплебно, зрелищно и очень познавательно! Попробуем такой процесс: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Первый в мире PHP-линч пройдёт в эту среду в 18 часов на канале PHP Point. Запись обязательно будет. https://youtu.be/MwMCzqvCGKo
    PHP-линч #1

    После нашей субботней встречи у меня появилась идея комментировать PHP-код на постоянной основе. Должно получиться пхплебно, зрелищно и очень познавательно! Попробуем такой процесс: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Первый в мире PHP-линч пройдёт в эту среду в 18 часов на канале PHP Point. Запись обязательно останется. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying.

    YouTube
  • Пых

    🔴 Пыхэфир в эту субботу! Дорогие пыхари, давненько мы с вами не виделись! В эту субботу у меня как раз будет время, чтобы это исправить. Буду готов обсудить новости из мира PHP, прокомментировать чей-нибудь код, ответить на любые вопросы по PHP да и просто поговорить за жизнь. Пишите в комментариях, всё, что вам могло бы быть интересно. Встречаемся в субботу в 17 на канале PHP Point. Если не будете онлайн, не переживайте, запись никуда не денется. https://youtu.be/2UiGZVrNG6c
  • Пых

    Continious Integration 2.0 Почти полтора года назад я выложил пост с основными идеями для CI-пайплайна проекта на PHP. С тех пор не так много изменилось, разве что Rector стабилизировался и для многих стал инструментом рефакторинга номер один, а в Composer появился встроенный анализ уязвимостей. Представляю обновлённый список по категориям ("+" помечены новые пункты, через "/" перечислены альтернативы). Рефакторинг + автоматический рефакторинг и актуализация кода (Rector), • кодстайл (PHP CS Fixer / PHP_CodeSniffer / EasyCodingStandard), • статический анализ (Psalm / PHPStan / PHPMD). Пакеты + проверка на уязвимости (composer audit), • валидность composer.json (composer validate), • явное требование задействованных пакетов (ComposerRequireChecker), • отсутствие неиспользуемых пакетов (composer-unused). Symfony Dependency Injection + собирабельность prod-контейнера (bin/console cache:clear --env=prod), • проверка синтаксиса Yaml-файлов (bin/console lint:yaml config --parse-tags), • проверка соответствия типов инъекций контейнера Symfony (bin/console lint:container), • отсутствие устаревших сервисов и конфигов Symfony (bin/console debug:container --deprecations). Twig • проверка синтаксиса Twig-шаблонов (bin/console lint:twig). Doctrine • валидность маппинга и соответствие ему схемы БД (bin/console doctrine:schema:validate), • корректность продакшн-конфигурации (bin/console doctrine:ensure-production-settings --env=prod). Модули • контроль связности/зацепления и направления зависимостей (Deptrac). Ну и конечно же тесты + мутационное тестирование (Infection), • сами тесты (PHPUnit / Codeception). Список всё так же вдохновлён нашим пайплайном в HappyInc. Пишите в комментариях, без чего не обходится сборка вашего проекта и что ещё рекомендуете попробовать. Также обратите внимание на репозиторий Static analysis tools for PHP и доклад 25+ инструментов для аудита кода.
    GitHub - rectorphp/rector: Instant Upgrades and Automated Refactoring of any PHP 5.3+ code

    Instant Upgrades and Automated Refactoring of any PHP 5.3+ code - GitHub - rectorphp/rector: Instant Upgrades and Automated Refactoring of any PHP 5.3+ code

    GitHub