Пых – Telegram
Пых
8.28K subscribers
260 photos
14 videos
6 files
566 links
Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://news.1rj.ru/str/isPHPdying

Статистика: https://news.1rj.ru/str/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
Пых
Почему позднее связывание статическое? В PHP есть такая фича, как позднее статическое связывание (late static binding или LSB). Она позволяет обратиться к вызываемому/инстанциированному классу в контексте наследования. Когда-то давно для работы с LSB использовались…
self вместо static в финальных классах

Изначально я садился писать этот пост, но решил вас предварительно разогреть... 😉

Представьте себе такую ситуацию:


interface A
{
public static function new(): static;
}

final class B implements A
{
public static function new(): self
{
return new self();
}
}


Есть ли тут ошибка? Поначалу кажется, что есть. В интерфейсе сказано: нужно вернуть инстанс класса позднего статического связывания, а реализация использует более широкий тип self и поэтому нарушает LSP. PHP тоже так считает: https://3v4l.org/qWDQY.

А теперь обратим внимание, что класс B финальный! В цепочке наследования после B уже никого не может быть, это самый "поздний" возможный класс. В финальном классе всегда self =:= static. Так что ошибки на самом деле нет!

Недавно подписчик Пыха @m1chael19 закинул PR с исправлением этого недоразумения. Фикс посчитали очень логичным и смерджили в 8.5 без RFC. Поздравим Михаила с первым контрибьютом в PHP!

https://github.com/php/php-src/pull/17724
https://3v4l.org/qWDQY/rfc#vgit.master
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥93🎉40👍23🤔3
Друзья, я долго вынашивал этот план. Заручился поддержкой трёх родных ивент-компаний и сегодня принял окончательное решение:

В сентябре у нас будет Пых.Конф!

Подробности чуть позже.
🔥186👍38😱17🫡5🎃2🦄2🤯1
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude

На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует.

Встречаемся в ближайшую среду (26 марта) в 19:00!

YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
5🔥79👍246😱3
Пых
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет…
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude

Сегодня Павел Бучнев заставит меня попробовать Claude! Посмотрим, что из этого выйдет!

Стрим перенесли на час, присоединяйтесь в 20:00.

YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
Генератор контекста: https://docs.ctxgithub.com/
Промпт: https://gist.github.com/butschster/1b7e597691cc1a6476b15dc120ecbddb
🔥27👍6💩3😁1
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection

Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко.

Приходите в 18, разогрею вас перед стримом фартанов!

https://youtu.be/viWYmUUsD5I
https://vkvideo.ru/video-228746873_456239037
👍43🔥2
Пых
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко. Приходите в 18, разогрею…
Как подменить файл из autoload.files

Сегодня в конце стрима я написал в тикете Infection, почему мутация функций очень полезна. Один из мейнтейнеров поставил под вопрос возможность подмены оригинальных файлов из секции autoload.files на мутированные. Ну а поскольку я обожаю такие вызовы, я пошёл смотреть не на жену, а в код сгенерированного автолоадера Composer:

if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

require $file;
}

И придумал следующую лазейку:

function disableAutoloadFile(string $vendorDir, string $file): void
{
/** @var array<non-empty-string, non-empty-string> */
$idToFileMap = require $vendorDir . '/composer/autoload_files.php';

$id = array_search(realpath($file), $idToFileMap);

if ($id === false) {
throw new LogicException("File `{$file}` is not registered in autoload.files");
}

if (isset($GLOBALS['__composer_autoload_files'][$id])) {
throw new LogicException("File `{$file}` is already loaded");
}

$GLOBALS['__composer_autoload_files'][$id] = true;
}

disableAutoloadFile(__DIR__ . '/vendor', __DIR__ . '/src/functions.php');
require_once $infectionTmp . '/functions_mutated.php';

require_once __DIR__ . '/vendor/autoload.php';

Да, грязновато, но, похоже, это единственный способ добавить мутацию функций в Infection...

Готовы вместе со мной поработать в Цеху в эти выходные?! Ставьте 💯, если да!
Please open Telegram to view this post
VIEW IN TELEGRAM
💯39👍17🥴12🔥72😁2🥰1🤔1
Пых
Как подменить файл из autoload.files Сегодня в конце стрима я написал в тикете Infection, почему мутация функций очень полезна. Один из мейнтейнеров поставил под вопрос возможность подмены оригинальных файлов из секции autoload.files на мутированные. Ну а…
Open Source Цех #5 / Мутация функций в Infection

Через час в 15 жду всех в Цеху! Попробуем научить Infection мутировать функции, а заодно разберёмся, как работает замечательный фреймворк мутационного тестирования от Макса Рафалко.

YouTube: https://youtu.be/UTaRm_sZr_w
VK Видео: https://vkvideo.ru/video-228746873_456239039
Тикет: https://github.com/infection/infection/issues/1482
Задонатить: https://www.donationalerts.com/r/vudaltsov
🔥15👍83
Пых
Коллекционный PHP-слоник 💙 Пых! Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам. Я давно мечтал о слоне для Пыха…
Последняя возможность купить 💙 слона!

В прошлую среду кампания по сбору средств на партию коллекционных слоников Пых достигла финансовой цели, преодолев порог в ₽400к! Это очень круто, я не ожидал, что всё получится так быстро — спасибо вам огромное за такую мощную поддержку!

Производство стартовало ещё на прошлой неделе, ориентировочная дата завершения — 1 июля. С учётом доставки партии из Иркутска в Москву, я надеюсь, что начну вам отправлять слоников уже 7 июля.

А теперь радостные новости по поводу лекции. Сегодня я связался с менеджером planeta.ru, объяснил, что нам нет смысла ждать 20 апреля, и она согласилась завершить проект досрочно — 2 апреля!

Это означает, что у тех, кто ещё не заказал слоника, осталось 3 дня, чтобы поддержать проект. А я тем временем начинаю готовиться к лекции по MessageBus. До встречи!

https://planeta.ru/campaigns/phpyh_slon
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34👍9👏71🍌1
Реальная история названия канала

https://www.urbandictionary.com/define.php?term=P.Y.H

С 1 апреля!
😁118🔥23😱64👍3👎3🌚3🤣1
Пых
Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко. Приходите в 18, разогрею…
Смерджили мой PR в Brick\Math с Open Source Цеха #4!

https://github.com/brick/math/pull/90

Суть изменения тривиальна: сузить возвращаемый тип BigInteger::__toString() и BigDecimal::__toString() до numeric-string, чтобы после приведения к строке значения можно было передавать в numeric-string и non-empty-string параметры (мне это потребовалось в недрах Typhoon).

Сначала на стриме я попробовал по-честному расставить типы по всей внутрянке, но упёрся в то, что в местах конкатенации numeric-string не выводится и его нужно форсить (прописывать @var или assert). В итоге предложил автору лёгкий путь: зафорсить тип только в самом методе __toString() и больше ничего не менять.

BenMorel согласился с моими доводами и зарелизил улучшение в 0.13.1.

Процесс контрибьютинга от форка до PR:
https://youtu.be/viWYmUUsD5I?t=3900s
https://vkvideo.ru/video-228746873_456239037?t=1h7m20s
👍38🔥155🏆2❤‍🔥1🤣1
Пыхап #3 / 18 апреля 2025

Ровно через 2 недели состоится третий Пыхап! В программе 2 доклада и так полюбившийся вам Открытый микрофон:

😨 Раскапываем редис
Алексей Сидоркин раскроет нам все нюансы работы с Redis: кластеризация, AOF vs RDB, структуры данных и клиенты для PHP.

💰 Лайвкодим крипту на PHP
Сергей Жук снова достанет свои Money и, пошарив экран, покажет, как перевести крипту и не остаться с "нонсом".

🎤 Открытый микрофон (только офлайн)
В конце митапа любой участник сможет на 5-10 минут завладеть микрофоном и флипчартом и поделиться насущной проблемой, элегантным решением или историей про то, как уронил накануне прод.

🍕 В перерывах традиционное пицца-driven общение, а после митапа афтепати в грузинском ресторане.

Пыхап пройдёт всё там же — в уютном лофте «Событие» на Таганке. Собираемся в пятницу в 18:30. Ну и конечно же митап будет транслироваться на YouTube и VK Видео с записью!

https://phpyh.timepad.ru/event/3250220/#register

Спонсор третьего Пыхапа — YCLIENTS.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33👍148
PHP True Async: обсуждаем RFC с автором

1 марта Дмитрий опубликовал первую версию RFC "PHP True Async". Цели предложения: установить стандарт конкурентного программирования на PHP, разработать С-API, отрефакторить существующие функции и расширения.

В процессе бурного обсуждения в internals было поднято несколько важных вопросов:
▸ На какие этапы следует разбить такой большой проект?
▸ Нужно ли явно активировать Scheduler и как это связано с обратной совместимостью?
▸ Нужна ли в PHP structured concurrency? Как это согласуется с файберами?
▸ Будет ли поддержка многопоточности, как, например, в Go?

Чтобы во всём этом разобраться, я решил организовать стрим с участием Дмитрия, разработчика RFC, и Вадима, автора доклада Чем вам не угодил асинхронный PHP? на PHP Russia 2024.

Встречаемся в эту среду 9 апреля в 19:00 МСК:
https://youtu.be/K9FnRQIzklM
https://vkvideo.ru/video-228746873_456239042

Предвкушаю непростой для понимания разговор, поэтому приступил к изучению матчасти. Вот несколько полезных ссылок:
Первая версия RFC, 1-я фаза обсуждения
Обновлённая версия RFC, 2-я фаза обсуждения
Репозиторий с самыми актуальными текстами Дмитрия на GitHub
Notes on structured concurrency, or: Go statement considered harmful
Java Virtual Threads, Kotlin Coroutines, Swift Structured concurrency
🔥58👍144
Пых
Пыхап #3 / 18 апреля 2025 Ровно через 2 недели состоится третий Пыхап! В программе 2 доклада и так полюбившийся вам Открытый микрофон: 😨 Раскапываем редис Алексей Сидоркин раскроет нам все нюансы работы с Redis: кластеризация, AOF vs RDB, структуры данных…
Регистрация на Пыхап #3 открыта!

https://phpyh.timepad.ru/event/3250220/#register

В конце следующей недели пройдёт третий Пыхап. В программе 2 доклада, Открытый микрофон (только офлайн), пицца и афтепати.

🗓 18 апреля в 18:30 (пятница)

📍 Событие Лофт на Таганке

💸 1000р. за офлайн-билет, участие онлайн бесплатное

Спонсор митапа — YCLIENTS.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥95👍5
Property Hooks во всей красе

Вчера на курсе обратил внимание, что низкоуровневый интерфейс обработчика сообщений, о котором многие из вас скоро узнают на лекции по MessageBus, в PHP 8.4 было бы в разы приятнее имплементировать. Как это выглядит сейчас:


interface Handler
{
public function id(): string;

public function handle(Context $context): mixed;
}

final readonly class CallableHandler implements Handler
{
public function __construct(
private string $id,
private Closure $handler,
) {}

public function id(): string
{
return $this->id;
}

public function handle(Context $context): mixed
{
return ($this->handler)($context);
}
}


Бесит, что для id в имплементации надо так много всего написать. А вот аналогичный вариант в PHP 8.4:


interface Handler
{
public string $id { get; }

public function handle(Context $context): mixed;
}

final readonly class CallableHandler implements Handler
{
public function __construct(
public string $id,
private Closure $handler,
) {}

public function handle(Context $context): mixed
{
return ($this->handler)($context);
}
}


Ну кайф же? -5 строк кода! К сожалению, я пока не могу себе позволить писать опенсорсные либы с "php": "^8.4", но хоть вы за меня на проектах оттянитесь!
___________

Тем временем разобрали половину билетов на Пыхап в следующую пятницу. Регистрация продолжается: https://phpyh.timepad.ru/event/3250220/#register
🔥27👍12💩5👎41
Пых
PHP True Async: обсуждаем RFC с автором 1 марта Дмитрий опубликовал первую версию RFC "PHP True Async". Цели предложения: установить стандарт конкурентного программирования на PHP, разработать С-API, отрефакторить существующие функции и расширения. В процессе…
PHP True Async: обсуждаем RFC с автором

Сегодня в 19:00 по Москве мы встретимся с Дмитрием и Вадимом, чтобы обсудить RFC PHP True Async и перспективы появления нативной асинхронности в PHP. Основные темы:

▸ Опыт других языков.
▸ Экосистемы AMPHP, ReactPHP, Swoole.
▸ Нужна ли в PHP structured concurrency? Как это согласуется с файберами?
▸ Будет ли поддержка многопоточности, как, например, в Go?
▸ На какие этапы будет разбит такой большой проект?

https://youtu.be/K9FnRQIzklM
https://vkvideo.ru/video-228746873_456239042

🎫 Авторы самых интересных вопросов в чате трансляции получат бесплатные билеты на третий Пыхап!

Для подготовки рекомендую изучить RFC, а также посмотреть доклад Вадима Чем вам не угодил асинхронный PHP? Другие полезные ссылки в первом анонсе.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍167😢1
Краудфандинг. Лекция по MessageBus

Проект Коллекционный PHP-слоник Пых успешно собрал средства. Вы перевыполнили план аж на 21%! 💙

Как мы действуем дальше:

▸ Завтра (12 апреля) в 14:00 я прочитаю лекцию по MessageBus. Для получения ссылки на трансляцию обратитесь к новоиспечённому помощнику канала Пых — Хоботу.

▸ По слоникам PHP 8 я передал информацию Сергею Пантелееву. Он уже всем написал в личку и приступил к отправке.

Пых-слоники, как вы знаете из предыдущих новостей, давно запущены в производство и должны приехать ко мне в начале июля. Тогда же я начну проводить личные встречи.

Ещё раз всем спасибо за участие и до встречи на лекции!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥218