В следующем коде, используя любой произвольный имя класса (ABCDException) с instanceof
Не возникает ни одной фатальной ошибки.
<?php
function fn($x)
{
if ($x === 0) {
throw new InvalidArgumentException('cannot be zero');
}
}
try {
fn(0);
}
catch (Exception $ex) {
if ($ex instanceof ABCDException) {
echo 'instance of ABCDException';
}
}
На странице http://php.net/manual/en/language.operators.type.php, он указал:
Есть несколько подводных камней, о которых нужно знать. До версии PHP 5.1.0,
instanceof будет вызывать __autoload (), если имя класса не существует. В
Кроме того, если класс не был загружен, произойдет фатальная ошибка.
но до сих пор не ясно, почему возникшая фатальная ошибка была устранена.
Я хочу знать, почему ошибка не происходит в этом случае.
PHP не нужно знать о деталях реализации ABCDException
выяснить, $ex
является instanceof
Это. Все, что ему нужно сделать, — это проверить, является ли сам объект экземпляром класса с таким именем или наследует ли класс объекта какой-либо родительский объект с таким именем или реализует ли какой-либо из них какой-либо интерфейс с таким именем. То, определено ли это имя как класс или интерфейс, довольно не имеет значения для этой цели, поскольку детали реализации ничего не изменят в результате.
Я предполагаю, что разработчики PHP перестали пытаться загрузить реальный класс, так как это просто излишне снижает производительность.
Других решений пока нет …