型演算子
instanceof
を使用して、
ある PHP 変数が特定の
クラス
のオブジェクトのインスタンスであるかどうかを調べます。
例1 クラスでの instanceof
の使用法
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
instanceof
は、ある変数が
特定の親クラスを継承したクラスのオブジェクトのインスタンスであるかどうかを調べることもできます。
例2 継承したクラスでの instanceof
の使用法
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
あるオブジェクトが特定のクラスのインスタンスで ない
ことを調べるには、
論理 否定
演算子
を使用します。
例3 instanceof
を使用して、オブジェクトがクラスのインスタンスで ない
かどうかを調べる方法
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
最後に、instanceof
は、ある変数が特定の
インターフェイス
を実装したクラスのオブジェクトのインスタンスであるかどうかも調べることができます。
例4 インターフェイスでの instanceof
の使用法
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
通常、instanceof
ではリテラルのクラス名を使用しますが、
別のオブジェクトや文字列変数を使用することもできます。
例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 MyClass クラスのオブジェクトです
var_dump($a instanceof $c); // $c は文字列 'MyClass' です
var_dump($a instanceof $d); // $d は文字列 'NotMyClass' です
?>
bool(true)
bool(true)
bool(false)
instanceof は、もし確かめる変数がオブジェクトでなくてもエラーになりません。単に
false
を返すだけです。ただし、PHP 7.3.0 以前では、定数を調べることはできませんでした。
例6 instanceof
での他の変数の調べかた
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a は配列です
var_dump($b instanceof stdClass); // $b は NULL です
var_dump($c instanceof stdClass); // $c はリソースです
var_dump(FALSE instanceof stdClass);
?>
bool(false)
bool(false)
bool(false)
PHP Fatal error: instanceof expects an object instance, constant given
PHP 7.3.0 以降では、
instanceof
の左辺値に定数を指定できるようになりました。
例7 instanceof
を使って定数を確認する
<?php
var_dump(FALSE instanceof stdClass);
?>
上の例の PHP 7.3 での出力は、このようになります。
PHP 8.0.0 以降では、
instanceof
は任意の式と一緒に使えるようになりました。
式は文字列を生成するもので、かつ括弧で囲む必要があります。
例8 instanceof
を任意の式と一緒に使う
<?php
class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}
function getSomeClass(): string
{
return ClassA::class;
}
var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>
上の例の PHP 8 での出力は、このようになります。:
bool(true)
bool(true)
bool(false)
bool(true)
instanceof
演算子は、is_a
関数とは機能的に異なる部分があります。