Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中将任意类名与instanceof一起使用时不会发生错误_Php_Instanceof - Fatal编程技术网

在PHP中将任意类名与instanceof一起使用时不会发生错误

在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

在下面的代码中,将任意类名(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';
    }
}

PHP不需要知道
ABCDException
的实现细节,就可以确定
$ex
是否是它的
实例。它所需要做的只是检查对象本身是否是该名称的类的实例,或者对象的类是否从该名称的任何父类继承,或者是否有任何父类实现了该名称的任何接口。该名称是否实际定义为类或接口与此目的无关,因为实现细节不会改变任何结果


我想PHP开发人员停止了加载实际类的尝试,因为这会导致不必要的性能损失。

如果
ABCDException
还没有加载,那么$ex不可能是该类的实例(否则在抛出异常时就会加载它),那么给自动装弹机打电话有什么意义吗。。。它可以被视为false,而不需要加载类的开销,因此我们可以简单地说,PHP解释器知道已从中创建现有对象的所有已加载类,因此无需尝试加载该类,因为对象不能是PHP尚未加载的类型。这在很大程度上概括了它,这不会导致错误,因为开发人员可能假设
instanceof
中的类可用,并且没有错误已经抛出,因此代码是好的。这可能发生在错误键入类的情况下:
InvalidArgmentException
而不是
InvalidArgmentException
。这是在加载类的开销(以及可能触发致命错误以“脏”方式终止脚本)之间的权衡;以及开发人员的理解/努力。。。。但是防止潜在的致命错误通常不被认为是一个bug