instanceof(类型运算符)

为了检查某个对象是否属于某个类,从 PHP 版本 5 开始,可以使用(二进制)instanceof 运算符。

第一个(左)参数是要测试的对象。如果此变量不是对象,则 instanceof 始终返回 false。如果使用常量表达式,则会引发错误。

第二个(右)参数是要比较的类。该类可以作为类名本身提供,包含类名(不是字符串常量!)的字符串变量或该类的对象。

class MyClass {
}

$o1 = new MyClass();
$o2 = new MyClass();
$name = 'MyClass';

// in the cases below, $a gets boolean value true
$a = $o1 instanceof MyClass;
$a = $o1 instanceof $name;
$a = $o1 instanceof $o2;

// counter examples:
$b = 'b';
$a = $o1 instanceof 'MyClass'; // parse error: constant not allowed
$a = false instanceof MyClass; // fatal error: constant not allowed
$a = $b instanceof MyClass;    // false ($b is not an object)

instanceof 还可以用于检查对象是否属于扩展另一个类或实现某个接口的某个类:

interface MyInterface {
}

class MySuperClass implements MyInterface {
}

class MySubClass extends MySuperClass {
}

$o = new MySubClass();

// in the cases below, $a gets boolean value true    
$a = $o instanceof MySubClass;
$a = $o instanceof MySuperClass;
$a = $o instanceof MyInterface;

要检查的对象是否是一些类的,未操作者(!)可用于:

class MyClass {
}

class OtherClass {
}

$o = new MyClass();
$a = !$o instanceof OtherClass; // true

请注意,不需要 $o instanceof MyClass 周围的括号,因为 instanceof 的优先级高于 !,尽管它可以使代码括号中更易读。

注意事项

如果某个类不存在,则调用已注册的自动加载函数以尝试定义该类(这是文档本部分范围之外的主题!)。在 5.1.0 之前的 PHP 版本中,instanceof 运算符也会触发这些调用,从而实际定义类(如果无法定义类,则会发生致命错误)。要避免这种情况,请使用字符串:

// only PHP versions before 5.1.0!
class MyClass {
}

$o = new MyClass();
$a = $o instanceof OtherClass; // OtherClass is not defined!
// if OtherClass can be defined in a registered autoloader, it is actually
// loaded and $a gets boolean value false ($o is not a OtherClass)
// if OtherClass can not be defined in a registered autoloader, a fatal
// error occurs.

$name = 'YetAnotherClass';
$a = $o instanceof $name; // YetAnotherClass is not defined!
// $a simply gets boolean value false, YetAnotherClass remains undefined.

从 PHP 5.1.0 版开始,在这些情况下不再调用已注册的自动加载器。

较旧版本的 PHP(5.0 之前)

在早期版本的 PHP(5.0 之前)中,is_a 函数可用于确定对象是否属于某个类。此函数在 PHP 版本 5 中已弃用,在 PHP 版本 5.3.0 中未过时。