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 中未过时。