PHPでもクラスによって処理を切り替えたいということがあると思います。この場合、インスタンスがどのクラスに属するものかを判定する必要になります。
PHPで型判定のためのツールはいろいろありますが、instanceofは属するクラスを判定するときに使えます。名前からは関数のようにも見えますが実は演算子なのです。
ここでは、PHPのinstanceofの使い方を説明するのとあわせて、関数によるクラス判定の方法などもご紹介します。
PHPプログラミングに興味のある方は、プログラミング学習の参考として、ぜひ読んでみてください。
目次
instanceofでクラスをチェックする
instanceofは演算子であって関数ではない
instanceofは、指定した変数があるクラスのインスタンスであるかどうかを調べるのに使用される型演算子(type operator)です。
演算子ですから、「===」や「>」と同様の使い方、同様の扱いと考えておけばよいでしょう。
PHPには、あるクラスのインスタンスであるかどうかを調べるたに別途関数も用意されています。それについては後ほど説明します。
インスタンスが特定クラスのオブジェクトかをチェックする
インスタンスが属するクラスをチェックしたい場合にinstanceofが使えます。
例
1 2 3 4 5 6 7 8 9 10 11 |
<?php class MyClass {} class OtherClass {} $a = new Class01; var_dump($a instanceof MyClass); var_dump($a instanceof OtherClass); ?> |
結果
1 2 |
bool(true) bool(false) |
継承したクラスのインスタンスかをチェックする
インスタンスが属するクラスが親クラスを継承している場合は、親クラスもチェックできます。
例
1 2 3 4 5 6 7 8 9 10 11 |
<?php class ParentClass {} class MyClass extends ParentClass {} $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof ParentClass); ?> |
結果
1 2 |
bool(true) bool(true) |
インターフェースを実装したクラスのインスタンスかをチェックする
インスタンスが属するクラスがインターフェースを実装している場合は、インターフェースもチェックできます。
例
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php interface MyInterface {} class MyClass implements MyInterface {} $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof MyInterface); ?> |
結果
1 2 |
bool(true) bool(true) |
クラスについてはこちらも参考に。
【初心者向け】PHPのオブジェクトとクラスを解説!instanceofを使うにあたっての留意点
PHP 7.3.0 以前では定数をチェックするとエラーになる
instanceofは演算子ですから、要素1instanceof要素2という形式をとります。
PHP 7.3.0 以前では要素1が定数である場合はエラーが発生します。
例
1 2 3 4 5 6 7 8 9 |
<?php $a = 1; $b = null; $c = imagecreate(5, 5); var_dump($a instanceof stdClass); // 整数ならfalse var_dump($b instanceof stdClass); // null ならfalse var_dump($c instanceof stdClass); // リソースならfalse var_dump(false instanceof stdClass); // 定数はエラー ?> |
結果
1 2 3 4 |
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given |
なお、PHP 7.3.0 以降では、 要素1に定数を指定した場合はfalseが戻され、エラーは発生しません。
演算子としての優先順位
あるインスタンスが指定したクラスのものでないことを判定したい場合はどうすればよいのでしょうか?
この判定用の演算子が用意されていないので、否定演算子( ! )を使用します。
演算子の優先順位は、「instanceof」の方が否定演算子(!)より高く設定されています。
これにより、以下の例に示すいずれの書き方でも正しい結果を得ることができます。
例
1 2 3 4 5 |
<?php $a = 1; var_dump(!($a instanceof stdClass)); var_dump( ! $a instanceof stdClass ); ?> |
結果
1 2 |
bool(true) bool(true) |
クラスとインスタンスの関係についてはこちらも参考に。
【php】クラスとインスタンスの特徴から関係性まで解説その他の関数
is_a
オブジェクトがこのクラスのものであるか、このクラスをその親クラスのひとつとしているかどうかを調べます。
1 |
is_a ( mixed $object , string $class_name , bool $allow_string ) |
パラメータ
パラメータ | 型 | 説明 |
---|---|---|
object | mixed | 調べたいクラス名、またはオブジェクトのインスタンス |
class_name | string | クラス名 |
allow_string | bool | このパラメータを false にすると、 クラス名を表す文字列を object に指定できなくなります。 そして、クラスが存在しない場合のオートローダーの呼び出しもしなくなります。 |
返り値
- オブジェクトがこのクラスのものであればtrue
- オブジェクトがこのクラスをその親クラスのひとつとしていれば true
- それ以外の場合は false
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // クラス定義 class MyClass { var $a = 'MyClass'; } // オブジェクトを作成します $WF = new MyClass(); if (is_a($WF, 'MyClass')) { echo "Yes, \$WF is MyClass. \n"; } ?> |
結果
1 |
Yes, $WF is MyClass. |
get_class
指定した object のクラス名を取得します。
1 |
get_class ( object $object ) |
パラメータ
パラメータ | 型 | 説明 |
---|---|---|
object | object | 調べるオブジェクト。 クラスの内部ではこのパラメータは省略可能。 PHP 7.2.0 以降は、object に明示的に null をセット不可。 |
返り値
- オブジェクト object がインスタンス であるクラスの名前を返します。
- object がオブジェクトでない場合にはfalseが返されます。
- クラスの内部で object を省略すると、 そのクラスの名前を返します。
- 名前空間の中のクラスでは、名前空間で修飾されたクラス名が返されます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php class foo { function name() { echo "My name is " , get_class($this) , "\n"; } } $bar = new foo(); // 外部からコール echo "Its name is " , get_class($bar) , "\n"; // 内部からコール $bar->name(); ?> |
結果
1 2 |
Its name is foo My name is foo |
クラス変数についてはこちらも参考に。
【初心者向け】PHPのクラス変数を解説!まとめ
いかがでしたか? 今回は、PHPのinstanceofの使い方を紹介しました。
クラスであるかの判定には、型演算子のほか関数も用意されています。自分でプログラムのメンテナンスのしやすい書き方を工夫しましょう。
この記事が、PHPプログラミングの学習の参考としてお役に立てば幸いです。