在PHP中将任意类名与instanceof一起使用时不会发生错误
在下面的代码中,将任意类名(ABCDException)与在PHP中将任意类名与instanceof一起使用时不会发生错误,php,instanceof,Php,Instanceof,在下面的代码中,将任意类名(ABCDException)与instanceof一起使用不会发生任何致命错误 <?php function fn($x) { if ($x === 0) { throw new InvalidArgumentException('cannot be zero'); } } try { fn(0); } catch (Exception $ex) { if ($ex instanceof ABCDExcepti
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';
}
}
PHP不需要知道ABCDException
的实现细节,就可以确定$ex
是否是它的实例。它所需要做的只是检查对象本身是否是该名称的类的实例,或者对象的类是否从该名称的任何父类继承,或者是否有任何父类实现了该名称的任何接口。该名称是否实际定义为类或接口与此目的无关,因为实现细节不会改变任何结果
我想PHP开发人员停止了加载实际类的尝试,因为这会导致不必要的性能损失。如果ABCDException
还没有加载,那么$ex不可能是该类的实例(否则在抛出异常时就会加载它),那么给自动装弹机打电话有什么意义吗。。。它可以被视为false,而不需要加载类的开销,因此我们可以简单地说,PHP解释器知道已从中创建现有对象的所有已加载类,因此无需尝试加载该类,因为对象不能是PHP尚未加载的类型。这在很大程度上概括了它,这不会导致错误,因为开发人员可能假设instanceof
中的类可用,并且没有错误已经抛出,因此代码是好的。这可能发生在错误键入类的情况下:InvalidArgmentException
而不是InvalidArgmentException
。这是在加载类的开销(以及可能触发致命错误以“脏”方式终止脚本)之间的权衡;以及开发人员的理解/努力。。。。但是防止潜在的致命错误通常不被认为是一个bug