TGViewer
Channel Public Channel
Пых

Пых

@phpyh

Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://t.me/isPHPdying

Статистика: https://t.me/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Subscribers
7.83K
Photos
287
Videos
20
Links
629

Showing posts older than #696 · Back to latest

Older Posts 19 shown
Post #695 5.89K
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
  • 👍 14
  • ❤ 4
Post #694 6.53K
Пыхап #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.
  • 🔥 33
  • 👍 14
  • ❤ 8
Post #693 7.12K
Пых 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
GitHub Force numeric-string return type in BigDecimal::__toString() and BigInteger::__toString() by vudaltsov · Pull Request #90 · brick/math Closes #89. @return numeric-string cannot be added to BigRational, because '10/20' is not a numeric string. So I added numeric-string to BigDecimal and BigInteger classes only. This...
  • 👍 38
  • 🔥 15
  • ❤ 5
  • 🏆 2
  • ❤‍🔥 1
  • 🤣 1
Post #690 6.29K
Пых Коллекционный PHP-слоник 💙 Пых! Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам. Я давно мечтал о слоне для Пыха…
Последняя возможность купить 💙 слона!

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

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

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

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

https://planeta.ru/campaigns/phpyh_slon
  • 🔥 34
  • 👍 9
  • 👏 7
  • ❤ 1
  • 🍌 1
Post #687 5.22K
Пых Open Source Цех #5 / Мутация функций в Infection Через час в 15 жду всех в Цеху! Попробуем научить Infection мутировать функции, а заодно разберёмся, как работает замечательный фреймворк мутационного тестирования от Макса Рафалко. YouTube: https://youtu.be/UTaRm_sZr_w…
Open Source Цех #5 / Мутация функций в Infection

Залетайте в Цех, начинаю разбирать 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

Комментировать можно под этим постом.
YouTube Open Source Цех #5 / Мутация функций в Infection В этом выпуске Цеха мы с вами попробуем научить Infection мутировать функции! Заодно поймём в нюансах, как работает этот замечательный фреймворк мутационного тестирования от Макса Рафалко. Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
  • 🔥 9
  • 👍 4
  • 💩 1
Post #686 5.51K
Пых Как подменить файл из 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
YouTube Open Source Цех #5 / Мутация функций в Infection В этом выпуске Цеха мы с вами попробуем научить Infection мутировать функции! Заодно поймём в нюансах, как работает этот замечательный фреймворк мутационного тестирования от Макса Рафалко. Тикет с обсуждением: https://github.com/infection/infection/issues/1482…
  • 🔥 15
  • 👍 8
  • ❤ 3
Post #685 5.72K
Пых 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...

Готовы вместе со мной поработать в Цеху в эти выходные?! Ставьте 💯, если да!
Telegram Пых Open Source Цех #4 / PHP-CS-Fixer, Brick\Math, Infection Сегодня в очередном выпуске Цеха изучим ревью моего PR в PHP-CS-Fixer с прошлых стримов, поконтрибьютим в пару проектов и посмотрим на канал @open_source_php от Димы Дерепко. Приходите в 18, разогрею…
  • 💯 39
  • 👍 17
  • 🥴 12
  • 🔥 7
  • ❤ 2
  • 😁 2
  • 🥰 1
  • 🤔 1
Post #683 5.77K
Post #676 7.23K
Пых Кодим с джуном на 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
YouTube Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует. Генератор контекста:…
  • 🔥 27
  • 👍 6
  • 💩 3
  • 😁 1
Post #675 8.92K
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude

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

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

YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
YouTube Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude На этот раз джуном буду я! Когда Павел Бучнев с канала PHP Fart Time узнал, что я всячески сопротивляюсь использованию LLM, он тут же решил меня переубедить, а заодно показать, как пишет код с помощью Claude и какие инструменты использует. Генератор контекста:…
  • 🔥 79
  • 👍 24
  • ❤ 6
  • 😱 3
Post #674 8K
Друзья, я долго вынашивал этот план. Заручился поддержкой трёх родных ивент-компаний и сегодня принял окончательное решение:

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

Подробности чуть позже.
  • 🔥 186
  • 👍 38
  • 😱 17
  • 🫡 5
  • 🎃 2
  • 🦄 2
  • 🤯 1
Post #673 8.41K
Пых Почему позднее связывание статическое? В 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
3v4l.org Online PHP editor | output for qWDQY Run your php code online; get statistics, vld output and compare output from all versions.
  • 🔥 93
  • 🎉 40
  • 👍 23
  • 🤔 3
Post #672 6.49K
Почему позднее связывание статическое?

В PHP есть такая фича, как позднее статическое связывание (late static binding или LSB). Она позволяет обратиться к вызываемому/инстанциированному классу в контексте наследования.

Когда-то давно для работы с LSB использовались функции forward_static_call, forward_static_call_array, get_called_class. Теперь всё это можно делать через static:


/**
* @psalm-consistent-constructor
* @phpstan-consistent-constructor
*/
class A
{
final public static function staticClass(): string
{
return static::class;
}

final public static function newStatic(): static
{
return new static();
}
}

class B extends A {}

var_dump(
A::staticClass(), // "A"
A::newStatic(), // object(A)
A::newStatic()::staticClass(), // "A"
B::staticClass(), // "B"
B::newStatic(), // object(B)
B::newStatic()::staticClass(), // "B"
);


Обратимся к документации, чтобы разобраться в нейминге. Почему связывание "позднее"?

Природа названия «позднее статическое связывание» возникает из внутренней логики работы языка. Связывание называется «поздним», потому что конструкция static:: разрешается не в тот класс, в котором определили метод, а вычисляется на основе информации в ходе исполнения программы.


Ок, это понятно. Но почему "статическое" и почему static?

Связывание также назвали «статическим», поскольку этот механизм в числе прочего умеет вызывать статические методы.


А вот тут не логично, согласитесь. static — это про то, что метод/свойство доступны без объекта, а не про то, на какой класс мы ссылаемся. Гораздо лучше было бы взять called:: или late::. Документация объясняет, почему так вышло:

Вместо введения нового ключевого слова для позднего статического связывания разработчики языка выбрали ключевое слово static, которое зарезервировали прежде.


Тем не менее, мы с вами так привыкли к static, что уже не чувствуем нелогичности этого нейминга...
  • 👍 55
  • 💯 13
  • 🔥 6
  • 🤯 5
  • ❤ 1
  • 👌 1
Post #671 7.17K
Сумма прописью

В последнее время я частенько работаю с договорами. Когда в тексте нужно поменять сумму прописью, я использую первый попавшийся онлайн-сервис. Но вчера случайно обнаружил, что то же самое можно сделать в PHP одной консольной командой (должно быть установлено расширение intl):

php -r "echo new NumberFormatter('ru', NumberFormatter::SPELLOUT)->format(12_345);"

двенадцать тысяч триста сорок пять


Сейчас вы в комментариях напишете, что я просто мог попросить "чатик" поправить мне договор. Но давайте не будем об этом. 😅

Вообще intl умеет делать кучу полезных вещей, но этот факт всё время вылетает из головы. Наверняка существует огромное количество велосипедов, которые можно было бы заменить парой вызовов соответствующих функций.
  • 🔥 99
  • 👍 53
Post #670 8.67K
Пых Ребята, мы уже собрали 25%! Я в шоке. Спасибо!
58% за день. Вы мои герои! 🦾
  • 🔥 55
  • 👍 19
  • ❤ 6
  • 🥱 2
Post #669 8.42K
Пых Коллекционный PHP-слоник 💙 Пых! Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам. Я давно мечтал о слоне для Пыха…
Ребята, мы уже собрали 25%! Я в шоке. Спасибо!
  • 🔥 34
  • 👏 7
  • 🍾 6
  • ❤ 4
  • 🫡 2
Post #668 10.4K
Коллекционный PHP-слоник 💙 Пых!

Как вы все знаете, маскот языка PHP — слон. В 1998 году Vincent Pontier придумал дизайн оригинального плюшевого слоника, который с тех пор был многократно переосмыслен по различным поводам.

Я давно мечтал о слоне для Пыха, и в конце прошлого года благодаря Сергею Пантелееву мне удалось заказать прототип: аккуратного синего слоника с логотипом канала на боку и белыми лапками.

Чтобы запустить в производство целую партию, я решил создать краудфандинговую кампанию! Среди вознаграждений — слоник Пых, слоник PHP 8 Сергея, та самая долгожданная лекция по Message Bus и личная встреча со мной. Переходите по ссылке и принимайте участие. Буду бесконечно рад, если у нас получится воплотить в жизнь этот проект! 💙

https://planeta.ru/campaigns/phpyh_slon
  • 🔥 43
  • 👍 32
  • ❤ 7
  • 👏 7
Post #667 8.82K
В честь 8 марта я немножко помучил Midjourney:

This is the logo of my Telegram channel about PHP in the form of an elephant. Add a flower to its trunk. Please keep the same image style.


С праздником, дорогие подписчицы! 💙
  • ❤ 64
  • 🔥 23
  • 👍 22
  • 🍓 5
  • 💩 3
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →