## 类型运算符
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)。
- 序言
- 简介
- PHP是什么?
- PHP能做什么?
- 基本语法
- 类型
- boolean(布尔型)
- integer(整型)
- float(浮点型)
- string(字符串)
- array(数组)
- object(对象)
- callable(可调用)
- resource(资源)
- NULL(无类型)
- 伪类型
- 类型转换的判别
- 变量
- 基础
- 预定义变量
- 变量范围
- 可变变量
- 来自PHP之外的变量
- 常量
- 语法
- 魔术常量
- 表达式
- 运算符
- 运算符优先级
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 错误控制运算符
- 执行运算符
- 递增/递减运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 类型运算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代语法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函数
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部 (内置)函数
- 匿名函数
- 类与对象
- 简介
- 基本概念
- 属性
- 类的自动加载
- 构造函数
- 访问控制(可见性)