Telegram Web
PHP RFC: Marking return values as important (#[\NoDiscard])

За internals не успеть в последнее время! Вот уже на голосование вышел RFC от Tim Düsterhus и Volker Dusch. Они предлагают добавить в PHP атрибут #[NoDiscard] — им можно будет пометить функции и методы, возвращаемое значение которых не стоит игнорировать. Например, вот такой код будет кидать E_WARNING, если RFC примут:


$date = new DateTimeImmutable('2024-1-1');
$date->setDate(2025, 1, 1); // E_WARNING

echo $date->format('Y'); // 2024


Возвращаемое значение считается использованным, если оно участвует в выражении или присваивании. Чтобы избежать предупреждения и явно в коде обозначить намерение не использовать результат вызова функции с #[NoDiscard], авторы RFC предлагают добавить (void) каст. Он превратит выражение в инструкцию:


flock($stream, LOCK_EX); // E_WARNING

(void) flock($stream, LOCK_EX); // OK

if ((void) flock($stream, LOCK_EX)) {} // Parse error


Использование #[NoDiscard] в функциях и методах, возвращающих void, never, а также в магических методах и хуках свойств приведёт к фатальной ошибке на этапе интерпретации.

По мнению авторов, этот атрибут будет полезен для функций с сайд-эффектами, которые при этом ещё что-то возвращают, например, ошибки.

https://wiki.php.net/rfc/marking_return_value_as_important
Пых
PHP RFC: Marking return values as important (#[\NoDiscard]) За internals не успеть в последнее время! Вот уже на голосование вышел RFC от Tim Düsterhus и Volker Dusch. Они предлагают добавить в PHP атрибут #[NoDiscard] — им можно будет пометить функции и…
Что я сам думаю по этому поводу?

Имхо, это такой же бесполезный атрибут, как и #[Override]. Никакого спроса лично у меня на эту фичу нет. Наверное, потому, что мои функции либо не мутируют стейт, либо возвращают void. Ну а к особенностям нативного апи я давно привык.

По сути, это очередная проблема, которая должна решаться статическим анализом, а не рантаймом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Коллекционный PHP-слоник 💙 Пых!

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

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

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

https://planeta.ru/campaigns/phpyh_slon
Please open Telegram to view this post
VIEW IN TELEGRAM
Пых
Ребята, мы уже собрали 25%! Я в шоке. Спасибо!
58% за день. Вы мои герои! 🦾
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Пых
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
Друзья, я долго вынашивал этот план. Заручился поддержкой трёх родных ивент-компаний и сегодня принял окончательное решение:

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

Подробности чуть позже.
Кодим с джуном на PHP #2 / Павел Бучнев учит Валентина работать с Claude

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

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

YouTube: https://youtu.be/UIrl1lIF2tE
VK Видео: https://vkvideo.ru/video-228746873_456239029
Пых
Кодим с джуном на 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
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
Пых
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
Пых
Как подменить файл из 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
Пых
Коллекционный 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
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/05/30 16:55:08
Back to Top
HTML Embed Code: