TGViewer
Пых Пых @phpyh · 7.87K subscribers
Post #946 10K
Хроники пакета exceptionally

Вы наверняка знаете проект thecodingmachine/safe.

A set of core PHP functions rewritten to throw exceptions instead of returning false when an error is encountered.



// вместо
$contents = @file_get_contents($file);

if ($contents === false) {
throw new RuntimeException("File {$file} is not readable");
}

// пишем
$contents = Safe\file_get_contents($file);


Такой подход мне всегда казался максимально бредовым: скодогенерировать обёртки над всеми стандартными PHP-функциями и написать плагины под каждый статанализатор вместо того, чтобы воспользоваться композицией функций.

Поэтому ночью 3 августа 2019 года я написал библиотечку vudaltsov/exceptionally, которая решала проблему куда более элегантно:


$contents = exceptionallyCall('file_get_contents', $file);


Тогда ещё не было стрелочных функций и first class callable синтаксиса, поэтому краткая запись могла выглядеть только так.

Забавно, что утром в тот же день в паре кварталов от моей квартиры загорелся склад, подробнее в личном канале.

Через 2 дня я предложил RFC в Symfony, а ещё через неделю Yonel Ceruto добавил статический метод ErrorHandler::call(), он там есть и по сей день.

Но настали времена, когда я больше не пишу на Symfony, а функция всё ещё актуальна. Поэтому я решил перенести vudaltsov/exceptionally в thesis/exceptionally, упростить и приправить дженериками:


/**
* @template T
* @param callable(): (T|false) $function
* @return T
* @throws \ErrorException
*/
function exceptionally(
callable $function,
int $errorLevels = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED,
): mixed {}

// PHP < 8.6
$contents = exceptionally(static fn () => file_get_contents($file));

// PHP >= 8.6 с partial function application
$contents = exceptionally(file_get_contents($file, ...));


Исключение ErrorException, кстати, существует в ядре ровно для этой задачи, поэтому помимо стандартных параметров оно принимает файл и номер строки.

Пользуйтесь Thesis Exceptionally на здоровье!


composer require thesis/exceptionally


Этот пост я разместил неделю назад в 🐘 PHPeople. Кстати, общая группа там теперь бесплатная — подписывайся на @phpeople_community!
  • 👍 24
  • 🤡 18
  • ❤ 7
  • 🔥 6
  • 🤔 3
  • 👏 2
  • 🤣 2
  • 💩 1
More from @phpyh
  1. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  2. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  3. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  4. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
  5. Sep 10, 2026Краткое содержание: завтра в 12:00 открываю набор на Хардкорный курс асинхронного PHP с уч…
  6. Sep 10, 2026Post #1011
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 →