Пых
Как в рантайме получить путь до текущего автолоадера? Сейчас работаю над PHP Extended Type System, и появилась задача использовать автолоадер Composer для получения файлов незагруженных классов по их имени. При этом хочется, чтобы по умолчанию пользователю…
Всё гораздо проще!
Я так и чувствовал, что надо было написать пост не только чтобы поделиться, но и потому что я что-то упустил.
@xepozz в комментариях к посту рассказал про метод
Теперь локатор и тест тривиальные: https://gist.github.com/vudaltsov/c7348a8aa54d0ada82c22134c6156001.
Спасибо огромное за то, что вы всегда так внимательно читаете посты и пишете кучу полезных комментариев!💙
Я так и чувствовал, что надо было написать пост не только чтобы поделиться, но и потому что я что-то упустил.
@xepozz в комментариях к посту рассказал про метод
ClassLoader::getRegisteredLoaders(), который возвращает массив активных лоадеров, проиндексированных по пути до vendor. А это ровно то, что мне было нужно!Теперь локатор и тест тривиальные: https://gist.github.com/vudaltsov/c7348a8aa54d0ada82c22134c6156001.
ComposerClassLocator покроет 95% случаев подгрузки пользовательских классов. В остальных 5% можно будет имплементировать свой локатор и через компоновщик объединить с другими.Спасибо огромное за то, что вы всегда так внимательно читаете посты и пишете кучу полезных комментариев!
Please open Telegram to view this post
VIEW IN TELEGRAM
Gist
ComposerClassLocator.php
GitHub Gist: instantly share code, notes, and snippets.
🔥40👍15❤11
Что выведет код?
Anonymous Quiz
21%
Uncaught Error: Class not found
14%
A\B\C
5%
B\C
14%
namespace\B\C
47%
Parse error: syntax error, unexpected token "namespace"
🤯78🔥15👍8👎4🌚2
Forwarded from Сергей Предводителев
🌿 Про атрибут Override в PHP 8.3
В PHP предлагается добавить специальный атрибут
Появление этого атрибута не ломает обратную совместимость, так как его использование опционально и, если его убрать, то метод будет также как и сейчас переопределяться.
Всё идёт к тому, что RFC будет принят (на текущий момент 20 голосов за и 0 против) и мы увидим
Несмотря на то, что применение атрибута для переопределяющих методов опционально, мне кажется, что использовать его нужно всегда и, скорей всего, IDE и статические анализаторы будут предлагать это сделать.
При изучении и разработке кода
Возможно, стоит в будущем (PHP 9 или 10 😎) вообще сделать добавление атрибута
Но у этой идеи есть и противники. Интересные обсуждения развернулись на reddit и externals.io 👀
В 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 👀
🔥43👍23❤6👎5😁1😢1👀1
Какие ключи у значений 'c' и 'e'?
Anonymous Quiz
23%
-9 и 11
37%
1 и 2
6%
2 и 3
15%
1 и 11
12%
2 и 4
7%
-11 и 11
🗿70👍35😱19💩17🤔7🔥3😁3🤡1
Ну что ж, давно не виделись?!
Линч в
https://youtu.be/lmTsDyF4e6A
Линч в
19:00! Расскажу, как у меня дела, какие планы на ближайшее время, и конечно же посмотрим проекты, которые вы скинете. До встречи!https://youtu.be/lmTsDyF4e6A
YouTube
PHP-линч #19 • Анонс моего курса • zlodes/php-prometheus-client • SerafimArts/ffi-sdl
0:00 Упс, я забыл, как запускать стрим...
0:43 @php-farttime
2:40 Я теперь работаю на себя
6:04 Анонс курса по PHP
26:40 Статус моих OpenSource-проектов
30:22 Линч zlodes/php-prometheus-client
55:20 Почему в Symfony рецепты лежат не вместе с бандлами
57:30…
0:43 @php-farttime
2:40 Я теперь работаю на себя
6:04 Анонс курса по PHP
26:40 Статус моих OpenSource-проектов
30:22 Линч zlodes/php-prometheus-client
55:20 Почему в Symfony рецепты лежат не вместе с бандлами
57:30…
🔥38❤8👍6🤮1
Пых
Ну что ж, давно не виделись?! Линч в 19:00! Расскажу, как у меня дела, какие планы на ближайшее время, и конечно же посмотрим проекты, которые вы скинете. До встречи! https://youtu.be/lmTsDyF4e6A
0:00 Упс, я забыл, как запускать стрим...
0:43 php-farttime
2:40 Я теперь работаю на себя
6:08 Анонс курса по PHP
26:40 Статус моих OpenSource-проектов
30:22 Линч zlodes/php-prometheus-client
55:20 Почему в Symfony рецепты лежат не вместе с бандлами
57:30 Ответы автора zlodes/php-prometheus-client на мои замечания
58:08 Зачем чувствовать себя тупым
1:01:54 Создаём окно при помощи SerafimArts/ffi-sdl
1:17:25 PhpStorm или Vim? Аналогия с барабанами О_о
1:20:36 Constructor Property Promotion
1:21:16 Почему я не использую Copilot
1:24:34 И снова про белую тему
1:27:36 Я долго дебажу автокомплит SDL и вывожу-таки на экран картинку!
2:04:05 Почти делаю Кириллу Pull Request
2:08:22 Финал
0:43 php-farttime
2:40 Я теперь работаю на себя
6:08 Анонс курса по PHP
26:40 Статус моих OpenSource-проектов
30:22 Линч zlodes/php-prometheus-client
55:20 Почему в Symfony рецепты лежат не вместе с бандлами
57:30 Ответы автора zlodes/php-prometheus-client на мои замечания
58:08 Зачем чувствовать себя тупым
1:01:54 Создаём окно при помощи SerafimArts/ffi-sdl
1:17:25 PhpStorm или Vim? Аналогия с барабанами О_о
1:20:36 Constructor Property Promotion
1:21:16 Почему я не использую Copilot
1:24:34 И снова про белую тему
1:27:36 Я долго дебажу автокомплит SDL и вывожу-таки на экран картинку!
2:04:05 Почти делаю Кириллу Pull Request
2:08:22 Финал
👍34🔥11❤4💩2🤔1
Код-румы для онлайн-собеседований
В этом месяце провожу для Evrone технические собеседования на позицию Middle/Senior PHP разработчика и активно использую Yandex Code для практических заданий.
Раньше я всё делал сложнее для собеседуемого: давал ссылку на Gist с заданием и просил пошарить экран с IDE. Сейчас просто создаю комнату с условием задачи, отправляю ссылку кандидату, и через пять секунд мы уже обсуждаем и правим один и тот же сниппет. Это как Google Docs или как если бы Code With Me от JetBrains был доступен прямо в браузере.
https://code.yandex-team.ru/
Об инструменте узнал от @adrenaL1nkin на собеседовании в Webinar. 😊
В этом месяце провожу для Evrone технические собеседования на позицию Middle/Senior PHP разработчика и активно использую Yandex Code для практических заданий.
Раньше я всё делал сложнее для собеседуемого: давал ссылку на Gist с заданием и просил пошарить экран с IDE. Сейчас просто создаю комнату с условием задачи, отправляю ссылку кандидату, и через пять секунд мы уже обсуждаем и правим один и тот же сниппет. Это как Google Docs или как если бы Code With Me от JetBrains был доступен прямо в браузере.
https://code.yandex-team.ru/
Об инструменте узнал от @adrenaL1nkin на собеседовании в Webinar. 😊
👍40🔥13👎9💩8
Пых
🔴 PHP-линч #20 Через час линч! https://youtu.be/j7w5nmk2AFE
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3
Что выведет код?
Anonymous Quiz
39%
Uncaught Error: Call to protected method B::hello() from scope C
61%
Hello!
🤡47🤯16👍14❤1
🤵 💍 👰
Сегодня у нас с Ольгой год семейной жизни! А ещё, так совпало, свадьба моего брата! По этому поводу мы записали кавер на любимую песню. Приглашаю вас послушать!
https://youtu.be/nIA4GDz9APE
Сегодня у нас с Ольгой год семейной жизни! А ещё, так совпало, свадьба моего брата! По этому поводу мы записали кавер на любимую песню. Приглашаю вас послушать!
https://youtu.be/nIA4GDz9APE
YouTube
Imagine — John Lennon Cover By Olga & Valentin
❤120🔥83👍39🍾12💩5
Что выведет код?
Anonymous Quiz
42%
Fatal error: Uncaught Error: Call to protected method B::hello() from scope C
58%
Hello!
💩39👍15🔥9😁8🤯1
К сожалению, в 19 не получается, поэтому проведу на час раньше из кафе. Надеюсь, будет нормально слышно.
https://youtu.be/DxmX2A_WJTk
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
PHP-линч #21
Внимание! Чтобы YouTube опубликовал ваш комментарий, пишите не полный URL, а, например, гитхаб/symfony/console.
Как устроен PHP-линч:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть…
Как устроен PHP-линч:
1. Во время стрима вы скидываете в чат трансляции ссылки на репозитории и в трёх словах описываете, что там. Это может быть…
👍7🔥7❤2
Пых
Вчера на линче коснулись нюансов работы автовайринга в Symfony. В какой-то момент я сказал, что даже если в DI найдётся ровно один сервис, реализующий некий интерфейс, то Symfony не заавтовайрит этот сервис без алиаса. Но в чате меня поправили, и я пообещал проверить.
Я был не прав. Действительно, если в контейнере имеется только один сервис, имплементирующий интерфейс, то он без дополнительных телодвижений будет использован для инъекции по этому интерфейсу. И только если таких сервисов 0 или несколько, будет выброшено исключение вида
Но в любом случае я рекомендую либо явно прописывать алиасы для автоваринга, либо хитрить и сразу регистрировать сервис под именем интерфейса, например:
Я был не прав. Действительно, если в контейнере имеется только один сервис, имплементирующий интерфейс, то он без дополнительных телодвижений будет использован для инъекции по этому интерфейсу. И только если таких сервисов 0 или несколько, будет выброшено исключение вида
Cannot autowire service "Client": argument "$dependency" of method "__construct()" references interface "Contract" but no such service exists. You should maybe alias this interface to one of these existing services: "Implementation", "AnotherImplementation".Но в любом случае я рекомендую либо явно прописывать алиасы для автоваринга, либо хитрить и сразу регистрировать сервис под именем интерфейса, например:
$services
->defaults()
->autowire()
->autoconfigure()
->set(Client::class)
->set(Contract::class, Implementation::class)
->args(...);
👍40🥴15🤔10🔥2🤨2❤1
В PHP 8.4/9 будет новый JIT!
На днях Дмитрий Стогов опубликовал сообщение в externals, в котором представил новый Just-in-Time компилятор (php/src#12079), основанный на собственном фреймворке Дмитрия Intermediate Representation.
Основной плюс нового подхода в том, что исходный код PHP освободится от низкоуровневых деталей JIT-компиляции. Теперь интерпретатор будет формировать так называемое промежуточное представление, которое вышеупомянутый фреймворк превратит в ассемблерный код с учётом процессорной специфики. Также новый JIT позволит в будущем применить дополнительные оптимизации (видимо, уже на стороне фреймворка) для получения более эффективного машинного кода. Минус же состоит в более долгой JIT-компиляции.
Изначально Дмитрий собирался оставлять обе версии JIT, но, судя по обсуждению в PR, многие не против просто поменять старую на новую и не париться с поддержкой двух компиляторов. Пока не очень понятно, когда именно всё это выйдет, но я охотно верю, что уже в PHP 8.4 (ноябрь 2024).
Большое спасибо Владимиру Плахотникову за идею для поста!
P.S. Я заболел, поэтому отложил все свои анонсы. Сейчас иду на поправку. Если всё будет хорошо, то в среду мы зарелизим на стриме Typhoon 0.2.0 (бывший PHP Extended Type System) с новой крутой статической рефлексией, а в четверг я опубликую заявку для записи на курс.
На днях Дмитрий Стогов опубликовал сообщение в externals, в котором представил новый Just-in-Time компилятор (php/src#12079), основанный на собственном фреймворке Дмитрия Intermediate Representation.
Основной плюс нового подхода в том, что исходный код PHP освободится от низкоуровневых деталей JIT-компиляции. Теперь интерпретатор будет формировать так называемое промежуточное представление, которое вышеупомянутый фреймворк превратит в ассемблерный код с учётом процессорной специфики. Также новый JIT позволит в будущем применить дополнительные оптимизации (видимо, уже на стороне фреймворка) для получения более эффективного машинного кода. Минус же состоит в более долгой JIT-компиляции.
Изначально Дмитрий собирался оставлять обе версии JIT, но, судя по обсуждению в PR, многие не против просто поменять старую на новую и не париться с поддержкой двух компиляторов. Пока не очень понятно, когда именно всё это выйдет, но я охотно верю, что уже в PHP 8.4 (ноябрь 2024).
Большое спасибо Владимиру Плахотникову за идею для поста!
P.S. Я заболел, поэтому отложил все свои анонсы. Сейчас иду на поправку. Если всё будет хорошо, то в среду мы зарелизим на стриме Typhoon 0.2.0 (бывший PHP Extended Type System) с новой крутой статической рефлексией, а в четверг я опубликую заявку для записи на курс.
🔥82👍14💊5❤1👀1🤝1
Пых
PHP Extended Type System 0.1.0 🚀 https://github.com/php-extended-type-system/type/releases/tag/0.1.0 https://github.com/php-extended-type-system/type-stringifier/releases/tag/0.1.0 https://github.com/php-extended-type-system/type-reflection/releases/tag/0.1.0…
Typhoon 0.2.0
Итак, завтра (21 сентября) в
Ещё раз расскажу, зачем это всё, как в общих чертах работает и какие инструменты ждать в ближайшее время.
https://youtu.be/lp5zj0DdQ28
Итак, завтра (21 сентября) в
19:00 собираемся на канале PHP Point для совместного релиза PHP Extended Type System 0.2.0 под новым названием Typhoon!Ещё раз расскажу, зачем это всё, как в общих чертах работает и какие инструменты ждать в ближайшее время.
https://youtu.be/lp5zj0DdQ28
YouTube
Typhoon 0.2.0 • Новое название • Новый конструктор типов • Новая статическая рефлексия
Подписывайтесь на наши каналы в 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.
• Пых 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.
🔥39👍13❤4🤔3