💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 类型运算符 instance用于确定一个PHP变量是否属于某一类[class](http://php.net/manual/zh/language.oop5.basic.php#language.oop5.basic.class) 的实例: **Example #1**对类使用instanceof ``` <?php class MyClass { } class NotMyClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof NotMyClass); ``` 以上例程会输出 : ~~~ bool(true) bool(false) ~~~ *instanceof* 也可用来确定一个变量是不是继承自某一父类的子类的实例: **Example #2 对继承类使用 *instanceof*** ``` <?php class ParentClass { } class MyClass extends ParentClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof ParentClass); ?> ``` 以上例程会输出: ~~~ bool(true) bool(true) ~~~ 检查一个对象是否*不是*某个类的实例,可以使用[逻辑运算符 *not*](http://php.net/manual/zh/language.operators.logical.php)。 **Example #3 使用 *instanceof* 检查对象*不是*某个类的实例** ``` <?php class MyClass { } $a = new MyClass; var_dump(!($a instanceof stdClass)); ?> ``` 以上例程会输出: ~~~ bool(true) ~~~ 最后,*instanceof*也可用于确定一个变量是不是实现了某个[接口](http://php.net/manual/zh/language.oop5.interfaces.php)的对象的实例: **Example #4 对接口使用 *instanceof*** ``` <?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof MyInterface); ?> ``` 以上例程会输出: ~~~ bool(true) bool(true) ~~~ 虽然 *instanceof* 通常直接与类名一起使用,但也可以使用对象或字符串变量: **Example #5 对其它变量使用 *instanceof*** ``` <?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; $b = new MyClass; $c = 'MyClass'; $d = 'NotMyClass'; var_dump($a instanceof $b); // $b is an object of class MyClass var_dump($a instanceof $c); // $c is a string 'MyClass' var_dump($a instanceof $d); // $d is a string 'NotMyClass' ?> ``` 以上例程会输出: ~~~ bool(true) bool(true) bool(false) ~~~ 如果被检测的变量不是对象,instanceof 并不发出任何错误信息而是返回 **`FALSE`**。不允许用来检测常量。 **Example #6 用 *instanceof* 检测其它变量** ``` <?php $a = 1; $b = NULL; $c = imagecreate(5, 5); var_dump($a instanceof stdClass); // $a is an integer var_dump($b instanceof stdClass); // $b is NULL var_dump($c instanceof stdClass); // $c is a resource var_dump(FALSE instanceof stdClass); ?> ``` 以上例程会输出: ~~~ bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given ~~~ 然而instanceof的使用还有一些陷阱必须了解。在PHP5.1.0之前,如果要检查的类名称不存在,instanceof会调用[\_\_autoload()](http://php.net/manual/zh/function.autoload.php)。另外,如果该类没有被装载则会产生一个致命错误。可以通过使用动态类引用或用一个包含类名的字符串变量来避开这种问题: **Example #7 避免 PHP 5.0 中 instanceof 引起的类名查找和致命错误问题** ``` <?php $d = 'NotMyClass'; var_dump($a instanceof $d); // no fatal error here ?> ``` 以上例程会输出: ~~~ bool(false) ~~~ *instanceof* 运算符是 PHP 5 引进的。在此之前用 [is\_a()](http://php.net/manual/zh/function.is-a.php),但是后来 [is\_a()](http://php.net/manual/zh/function.is-a.php) 被废弃而用 *instanceof* 替代了。注意自 PHP 5.3.0 起,又恢复使用 [is\_a()](http://php.net/manual/zh/function.is-a.php) 了。 参见 [get\_class()](http://php.net/manual/zh/function.get-class.php) 和 [is\_a()](http://php.net/manual/zh/function.is-a.php)。