在下面的代码中,使用任意任意类名(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页面中,它指定了:
有几个陷阱需要注意。在PHP5.1.0之前,如果类名不存在,instanceof将调用__autoload()。此外,如果未加载类,则会发生致命错误。
但仍不清楚为什么会出现致命错误。
我想知道为什么在这种情况下不会出现错误。
发布于 2017-11-21 11:34:29
PHP不需要知道ABCDException的实现细节,就可以知道$ex是否是instanceof。它所需要做的就是检查对象本身是否是该名称的类的实例,或者对象的类是否继承自该名称的任何父类,或者这些对象是否实现了该名称的任何接口。该名称是否实际定义为类或接口与此目的无关,因为实现细节不会更改任何有关结果的内容。
我认为PHP开发人员停止了加载实际类的尝试,因为这会不必要地导致性能损失。
https://stackoverflow.com/questions/47411972
复制相似问题