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

Пых

4468 @phpyh

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

  • Пых

    🌿 Про атрибут Override в PHP 8.3 В PHP предлагается добавить специальный атрибут #[Override], с помощью которого можно будет явно помечать методы, которые переопределяют методы из родительского класса. Например:
    class Parent {
        protected function run(): void {}
    }
     
    class Child extends Parent {
        #[\Override]
        public function run(): void {}
    }
    
    
    Если в классе Parent убрать метод run(), то будет брошено исключение. Появление этого атрибута не ломает обратную совместимость, так как его использование опционально и, если его убрать, то метод будет также как и сейчас переопределяться. Всё идёт к тому, что RFC будет принят (на текущий момент 20 голосов за и 0 против) и мы увидим #[Override] в PHP 8.3. Несмотря на то, что применение атрибута для переопределяющих методов опционально, мне кажется, что использовать его нужно всегда и, скорей всего, IDE и статические анализаторы будут предлагать это сделать. При изучении и разработке кода #[Override] позволит сразу понимать, что этот метод переопределяет родительский, и сократит время на выявление ошибок. Возможно, стоит в будущем (PHP 9 или 10 😎) вообще сделать добавление атрибута #[Override] для переопределяющих методов обязательным. Отсутствие атрибута в этом случае будет гарантировать, что метод ничего не переопределяет. Но у этой идеи есть и противники. Интересные обсуждения развернулись на reddit и externals.io 👀
  • Пых

    <?php
    
    namespace A;
    
    echo namespace\B\C::class;
  • Пых

    Всё гораздо проще! Я так и чувствовал, что надо было написать пост не только чтобы поделиться, но и потому что я что-то упустил. @xepozz в комментариях к посту рассказал про метод ClassLoader::getRegisteredLoaders(), который возвращает массив активных лоадеров, проиндексированных по пути до vendor. А это ровно то, что мне было нужно! Теперь локатор и тест тривиальные: gist.github.com/vudalts…c6156001. ComposerClassLocator покроет 95% случаев подгрузки пользовательских классов. В остальных 5% можно будет имплементировать свой локатор и через компоновщик объединить с другими. Спасибо огромное за то, что вы всегда так внимательно читаете посты и пишете кучу полезных комментариев! 💙
    ComposerClassLocator.php

    GitHub Gist: instantly share code, notes, and snippets.

    Gist
  • Реклама

  • Пых

    Как в рантайме получить путь до текущего автолоадера? Сейчас работаю над PHP Extended Type System, и появилась задача использовать автолоадер Composer для получения файлов незагруженных классов по их имени. При этом хочется, чтобы по умолчанию пользователю библиотеки не надо было явно указывать путь до autoload.php. Библиотека должна по возможности угадать его сама. Первое, что приходит в голову, — просчитать и захардкодить путь. Например, если у нас пакет называется extended-type-system/type-reflection, а класс локатора расположен в src/ClassLocator/ComposerAutoloadClassLocator.php, то после установки библиотеки путь от класса до автолоадера будет __DIR__ . '/../../../../autoload.php'. Теперь попробуем покрыть это тестом. Первый вариант — засимлинкать текущий автолоадер в нужную локацию и инстанциировать локатор. Получим максимально дурацкий и хрупкий тест, да ещё и выйдем за пределы рабочей директории. Второй вариант — честно установить либу в отдельной папке с использованием репозитория type: path, symlink: false и инстанциировать локатор там. Вот только запускать это всё придётся в отдельном процессе, иначе копия класса будет конфликтовать с исходником в пространстве имён. Короче, сложно и тоже хрупко. Поэтому я ещё почесал репу и придумал, как вообще отвязаться от расположения класса локатора:
    use Composer\Autoload\ClassLoader;
    
    $classLoaderFile = (new \ReflectionClass(ClassLoader::class))->getFileName();
    $autoloadFile = dirname($classLoaderFile, 2) . '/autoload.php';
    $autoloader = require $autoloadFile;
    То есть мы через рефлексию получаем путь к генерируемому композером классу ClassLoader (это, кстати, публичный контракт, на него можно смело положиться), а уровнем выше забираем наш autoload.php. При втором подходе локатор устойчив к перемещению и легко тестируется с текущим автолоадером.
    PHP Extended Type System

    PHP Extended Type System has 3 repositories available. Follow their code on GitHub.

    GitHub
  • Пых

    🔴 PHP-линч #18 Сегодня на линче новый компонент Yii 3: Hydrator! Мне его на днях скинул Сергей Предводителев, член экипажа Yii. Кстати, подписывайтесь на его канал @sergei_predvoditelev. По просьбам трудящихся пробуем стартовать позже, в 19. 😉 https://youtu.be/4_TVEgU3rpM
    PHP-линч #18

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

    YouTube
  • Пых

    PHP-линч #17

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

    YouTube
  • Пых

    PHP-линч #16 • Laravel Breeze • Wildberries API • ilyaplot/pulse

    0:00 Всем привет! 1:55 Бомблю от обновления Symfony Clock (https://symfony.com/blog/new-in-symfony-6-3-clock-improvements) 9:19 В чём смысл линчей? 10:51 Структура документации Symfony 12:04 Laravel Breeze 23:48 Wildberries API 28:40 Про парсинг signature в консольных командах Laravel 30:42 Разбивка апи по версиям 34:28 Консольные команды на атрибутах 39:50 Laravel Octane, Livewire 43:15 Смотрим https://github.com/ilyaplot/pulse 1:03:29 Общий комментарий по Pulse 1:05:50 Про интеграцию с фреймворками 1:06:38 Эталонные библиотеки (https://github.com/Ocramius/ProxyManager) 1:09:22 Стоимость foreach 1:10:57 Финал Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console. Как устроен PHP-линч: 1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть ваш пет-проект или библиотека, а может быть компонент (не)известного фреймворка. Заранее ссылки не принимаются. 2. Я выбираю проект по душе и клонирую репозиторий. 3. Комментирую на лету, говорю, что думаю, без обид. Все линчи всегда записываются, так что не переживайте, если не успеваете присоединиться в процессе. Подписывайтесь на наши каналы в Telegram: • Пых https://t.me/phpyh, • PHP Digest https://t.me/phpdigest, • PHP умирает?! https://t.me/isPHPdying. Поддержите канал на Boosty: https://boosty.to/phpyh.

    YouTube
  • Пых

    🔥 Уххх, сегодня забористо получилось! Советую посмотреть.
  • Пых

    PHP-линч #15

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

    YouTube
  • Пых

    PHP-линч #14

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

    YouTube
  • Пых

  • Пых

    🎮 DatsArt Space Мои хорошие друзья DatsTeam организовали очередной хакатон, в котором командам предстоит написать «геймпад» к некой «игровой консоли» и сыграть при помощи него в игру. Условия хакатона не ограничивают участников в выборе технологий, поэтому среди участников есть и пыхари! Пожелаем им удачи! Прямая трансляция стартует с минуты на минуту: https://youtu.be/OSDZVHsUSmE
    Хакатон DATSART от компании DatsTeam

    Шестой хакатон от DatsTeam - DatsArt Space! На первом этапе (21 апреля 17:00 - 22 апреля 16:00) команды создают свои варианты наших шедевров и получают баллы. Второй этап состоится 22 апреля 17:00 - 20:00 Условия хакатона не ограничивают участников в выборе технологий. Участники используют разные языки программирования. Пришло время узнать имя команды-победителя!

    YouTube
  • Пых

    👨‍🔬 Новая лекция от Пыха. LRU мемоизация. Часть 2. Из O(n) в O(1) Наконец-то записал вторую лекцию про LRU мемоизацию! Из неё вы узнаете, какая структура данных позволит нам получить решение с алгоритмической сложностью O(1) и как её построить самому. По дороге, как обычно, касаюсь ещё нескольких интересных мелочей. boosty.to/phpyh/p…74c13e3c
  • Пых

    Маппинг входящих данных на аргументы action-ов Наконец-то в Symfony это сделали! Теперь всякие RequestMappingBundle будут не нужны. Предлагаю отлинчевать на следующей неделе. 😉
    use Symfony\Component\HttpKernel\Attribute\MapQueryString;
    use Symfony\Component\HttpKernel\Attribute\MapRequestPayload;
    
    final class Action
    {
        public function __invoke(
            #[MapQueryString] MyQueryDataClass $query,
            #[MapRequestPayload] MyPayloadDataClass $payload,
        ): Response {
            // ...
        }
    }
    symfony.com/blog/ne…-objects
    New in Symfony 6.3: Mapping Request Data to Typed Objects (Symfony Blog)

    Symfony 6.3 introduces two new PHP attributes to map the incoming request data into typed objects like DTOs and validates them automatically.

    Symfony
  • Пых

    PHP-линч #13

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

    YouTube
  • Реклама

  • Пых

    <?php
    
    fclose(STDIN);
    var_dump(is_resource(STDIN));
  • Пых

    PHP-линч #12

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

    YouTube
  • Пых

    Laravel 10, PHPUnit 10, Readonly Properties, Hakana, and more: PHP Annotated Monthly, February

    PHP Annotated Monthly is a show where Roman and Brent look at the PHP news and give their own takes and opinions on it. #php #monthly #programming #web Links: - PHP Annotated Monthly's blog post: https://blog.jetbrains.com/phpstorm/2023/02/php-annotated-february-2023/ - Previous episode: https://www.youtube.com/watch?v=Dx4knBnuJaw - Sponsor 3v4l.org: https://github.com/sponsors/SjonHortensius/ Timestamps: 00:00 Intro 00:50 New PHP Releases 02:41 Laravel 10 04:58 Return Type Drama 09:27 PHPUnit 10 13:33 PER Coding Style 19:31 PHP Core News 21:04 Readonly Amendments RFC 23:23 Increments/Decrements RFC 25:40 Scope in Magic Methods RFC 28:31 Typed Class Constants RFC 30:27 Working with Substrings RFC 32:52 New Crawler Package 35:04 JSON Mapper Package 38:55 YII's Validator Package 40:09 Hakana 41:45 PHP Wishlist

    YouTube