## 類型運算符
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
- 函數
- 用戶自定義函數
- 函數的參數
- 返回值
- 可變函數
- 內部 (內置)函數
- 匿名函數
- 類與對象
- 簡介
- 基本概念
- 屬性
- 類的自動加載
- 構造函數
- 訪問控制(可見性)