Ответ
Основное изменение в PHP 7 — введение интерфейса Throwable, который стал базовым для всех бросаемых объектов. Это позволило создать отдельную иерархию Error для фатальных ошибок ядра (TypeError, ParseError, AssertionError и т.д.), которые в PHP 5 не могли быть перехвачены блоком try/catch.
Ключевые отличия:
-
Иерархия исключений:
- PHP 5: Все исключения наследуются от класса
Exception. - PHP 7: Появился интерфейс
Throwable. От него наследуются два основных класса:Exception(для исключений приложения) иError(для фатальных ошибок ядра).
- PHP 5: Все исключения наследуются от класса
-
Возможность перехвата ошибок: В PHP 7 критические ошибки, такие как передача аргумента неверного типа, теперь выбрасывают
TypeError, который можно перехватить.
Пример на PHP 7:
// В PHP 5 это вызвало бы фатальную ошибку, прерывающую выполнение.
// В PHP 7 ошибка типа преобразована в исключение.
try {
function sum(int $a, int $b): int {
return $a + $b;
}
$result = sum("10", "20"); // TypeError: Argument 1 must be of type int
} catch (TypeError $e) {
echo "Поймана ошибка типа: " . $e->getMessage();
// Можно выполнить логирование или альтернативную логику
}
- Новые классы ошибок: В PHP 7 появились
ArithmeticError(например, при целочисленном делении на ноль),DivisionByZeroError,AssertionError(при неудачномassert()).
Итог: PHP 7 унифицировал обработку ошибок и исключений через Throwable, сделав код более надежным, так как критические сценарии теперь можно обрабатывать корректно, а не полагаться на глобальные обработчики ошибок.
Ответ 18+ 🔞
Э, слушай, вот это история, блядь! Сидишь ты такой, пишешь на PHP, и тут — бац! — семёрка выкатилась. И тут такое началось, ёпта, просто овердохуища изменений.
Раньше-то, в пятерке, была простая, как три копейки, схема. Все исключения — они как бы от одного папочки, от Exception, шли. Ну, типа, семейка одна. А если ядро PHP, эта самая мартышлюшка, сбоило и выкидывало какую-нибудь фатальную ошибку — всё, пиши пропало. Программа — накрылась медным тазом, и никакой try/catch её не спасёт. Просто вжух — и ты в лучшем случае в логах ковыряешься.
А в семёрке, блядь, придумали интерфейс Throwable. И это, сука, гениально! Это как если бы раньше все сбои делились на «ой, я программист-распиздяй» и «ой, всё, комп сгорел», а теперь их всех под одну гребёнку причесали. От этого Throwable пошли две главные ветки: Exception (это наши, программерские косяки) и Error (это уже серьёзные крики ядра).
И что самое офигенное — эти крики ядра теперь можно ловить! Раньше передашь не тот тип в функцию — тебе сразу «Fatal Error» в лоб, и иди ты на хуй, перезапускай скрипт. А сейчас эта ошибка оборачивается в красивый такой TypeError, который уже в catch спокойненько прилетает. Сам от себя охуел, когда впервые увидел.
Смотри, вот живой пример, как это работает:
try {
function sum(int $a, int $b): int {
return $a + $b;
}
$result = sum("10", "20"); // Раньше — труп, сейчас — исключение TypeError
} catch (TypeError $e) {
echo "Поймана ошибка типа: " . $e->getMessage();
// И дальше не помираем, а, например, логируем или пользователю вежливо говорим, что он мудак
}
Красота же, да? Раньше бы тут концерт и был. А теперь — подозрение ебать чувствую, что всё под контролем.
Ещё новых классов ошибок навводили — ArithmeticError, DivisionByZeroError. Поделил на ноль — не крест на всём, а поймал исключение и обработал. Удобно, блядь!
В общем, суть в чём. В PHP 7 через этот Throwable всё к одному знаменателю свели. Теперь не важно, кто накосячил — ты, своей кривой рукой, или само ядро — со всем можно договориться в try/catch. Код стал надёжнее, падать стал меньше. Не то чтобы волнение ебать прошло совсем, но жить точно стало проще. Раньше доверия ебать ноль было к этим фаталам, а теперь хоть какая-то уверенность появилась.