Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】ReflectionClass::getInterfaceNames()メソッドの使い方

getInterfaceNamesメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getInterfaceNamesメソッドは、PHPのReflectionClassクラスに属し、特定のクラスが実装しているインターフェースの名前を取得するメソッドです。

ReflectionClassクラスは、PHPのリフレクションAPIの一部として、プログラムの実行中にクラスの構造や情報を動的に検査する機能を提供します。このgetInterfaceNamesメソッドを使用すると、ReflectionClassオブジェクトが表すクラスが実装しているすべてのインターフェースの完全修飾名を、文字列の配列として取得できます。

インターフェースとは、クラスが満たすべき機能の約束事を定義するもので、複数のクラスが共通の振る舞いを持つことを保証する際に用いられます。このメソッドは、あるクラスが具体的にどのインターフェースの約束事を守っているかを、コード上で確認したい場合に非常に有用です。例えば、アプリケーションの拡張機能として、特定のインターフェースを実装したクラスのみを受け付けるような設計をする際などに、実行時にそのクラスが要件を満たしているかを確認するために活用できます。

メソッドが返す配列には、実装されている各インターフェースの名前が文字列として格納されます。もし、対象のクラスがどのインターフェースも実装していない場合には、空の配列が返されます。これにより、プログラムはクラスのインターフェース実装状況に応じて、柔軟な処理を行うことが可能になります。

構文(syntax)

1<?php
2
3interface FirstInterface {}
4interface SecondInterface {}
5interface ThirdInterface extends SecondInterface {}
6
7class MyClass implements FirstInterface, ThirdInterface {}
8
9$reflectionClass = new ReflectionClass(MyClass::class);
10$interfaceNames = $reflectionClass->getInterfaceNames();
11
12print_r($interfaceNames);
13
14?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

このメソッドは、ReflectionClassオブジェクトが表すクラスが実装しているインターフェースの名前を配列として返します。

サンプルコード

PHP ReflectionClass で実装インターフェース名を取得する

1<?php
2
3// このインターフェースは、オブジェクトがリサイズ可能であることを示します。
4// リサイズ機能を持つクラスは、このインターフェースを実装し、resizeメソッドを提供する必要があります。
5interface Resizable
6{
7    public function resize(int $width, int $height): void;
8}
9
10// このインターフェースは、オブジェクトが移動可能であることを示します。
11// 移動機能を持つクラスは、このインターフェースを実装し、moveメソッドを提供する必要があります。
12interface Movable
13{
14    public function move(int $x, int $y): void;
15}
16
17// Rectangle(長方形)クラスは、ResizableとMovableの2つのインターフェースを実装します。
18// これは、Rectangleがリサイズも移動もできることを意味します。
19class Rectangle implements Resizable, Movable
20{
21    private int $width;
22    private int $height;
23    private int $x;
24    private int $y;
25
26    public function __construct(int $width, int $height, int $x, int $y)
27    {
28        $this->width = $width;
29        $this->height = $height;
30        $this->x = $x;
31        $this->y = $y;
32    }
33
34    // Resizableインターフェースの要件を満たすresizeメソッドの実装
35    public function resize(int $width, int $height): void
36    {
37        $this->width = $width;
38        $this->height = $height;
39        echo "Rectangle resized to {$width}x{$height}.\n";
40    }
41
42    // Movableインターフェースの要件を満たすmoveメソッドの実装
43    public function move(int $x, int $y): void
44    {
45        $this->x = $x;
46        $this->y = $y;
47        echo "Rectangle moved to ({$x},{$y}).\n";
48    }
49}
50
51// ReflectionClass を使用して、指定されたクラスに関する情報を取得します。
52// これにより、プログラムの実行中にクラスの構造(プロパティ、メソッド、実装しているインターフェースなど)を調べることができます。
53$reflectionClass = new ReflectionClass(Rectangle::class);
54
55// getInterfaceNames() メソッドを呼び出し、このクラスが実装しているすべてのインターフェースの名前の配列を取得します。
56$interfaceNames = $reflectionClass->getInterfaceNames();
57
58echo "クラス '" . Rectangle::class . "' が直接実装しているインターフェースの一覧:\n";
59
60// 取得したインターフェースの名前をループで表示します。
61if (!empty($interfaceNames)) {
62    foreach ($interfaceNames as $interfaceName) {
63        echo "- " . $interfaceName . "\n";
64    }
65} else {
66    echo "このクラスは、どのインターフェースも直接実装していません。\n";
67}
68
69?>

PHPのReflectionClass::getInterfaceNamesメソッドは、プログラムの実行中にクラスの情報を動的に取得するためのReflectionClassインスタンスから使用されるものです。このメソッドは引数を取らずに呼び出すことができ、対象のクラスが「直接」実装しているすべてのインターフェースの名前を文字列の配列として返します。

サンプルコードでは、RectangleクラスがResizableとMovableという二つのインターフェースを実装しています。ReflectionClassを使ってRectangleクラスの情報を取得し、getInterfaceNames()を呼び出すと、['Resizable', 'Movable']といったインターフェース名の配列が得られます。これにより、特定のクラスがどのような機能を実装することを約束しているのかを、実行時にプログラムで確認できるようになります。

もし、クラスがどのインターフェースも直接実装していない場合は、空の配列が戻り値として返されます。この機能は、クラスの設計や連携を調べたい場合や、柔軟なシステムを構築する際に非常に有用です。

getInterfaceNamesメソッドは、対象クラスがimplementsキーワードで「直接」実装しているインターフェースの名前のみを返します。親クラスが実装しているインターフェースや、継承されたインターフェースは含まれませんので、この点にご注意ください。

戻り値はインターフェースの「名前」を示す文字列の配列であり、インターフェースのオブジェクトそのものではありません。もし対象クラスがどのインターフェースも実装していない場合、このメソッドは空の配列を返します。サンプルコードのように、取得後にempty()で配列が空でないか確認する処理は、後続のエラーを防ぎ安全性を高めます。

リフレクション機能は、プログラム実行時にクラスの構造を動的に調査するための高度なAPIです。通常のアプリケーションロジックで頻繁に使用するものではなく、フレームワークやライブラリ開発、デバッグといった特殊な場面で役立ちます。

PHP ReflectionClass::getInterfaceNamesで実装インターフェース名を取得

1<?php
2
3/**
4 * このサンプルコードは、PHPのReflectionClass::getInterfaceNamesメソッドを使用して、
5 * クラスが実装しているインターフェースの名前を取得する方法を示します。
6 * ReflectionClassは、実行時にクラスの構造(プロパティ、メソッド、インターフェースなど)に関する情報を
7 * 取得できるPHPの強力な機能です。
8 */
9
10// 1. まず、いくつかのインターフェースを定義します。
11// インターフェースは、クラスが実装すべきメソッドの「契約」を定義します。
12interface Loggable
13{
14    public function log(string $message): void;
15}
16
17interface Configurable
18{
19    public function configure(array $options): void;
20}
21
22// 2. 次に、上記のインターフェースを実装するクラスを定義します。
23// クラスは`implements`キーワードを使用してインターフェースを実装します。
24class DatabaseLogger implements Loggable, Configurable
25{
26    public function log(string $message): void
27    {
28        echo "データベースにログを記録: {$message}" . PHP_EOL;
29    }
30
31    public function configure(array $options): void
32    {
33        echo "データベースロガーを設定: " . json_encode($options) . PHP_EOL;
34    }
35}
36
37// 3. インターフェースを実装しない別のクラスも定義します。
38class SimpleService
39{
40    public function run(): void
41    {
42        echo "サービスを実行中..." . PHP_EOL;
43    }
44}
45
46// 4. クラスの情報を実行時に分析するためのReflectionClassオブジェクトを作成します。
47// 引数には、情報を取得したいクラスの名前(文字列または`::class`定数)を渡します。
48$loggerReflector = new ReflectionClass(DatabaseLogger::class);
49
50echo "--- クラス '" . $loggerReflector->getName() . "' のインターフェース情報 ---" . PHP_EOL;
51
52// 5. getInterfaceNames()メソッドを呼び出し、実装しているインターフェースの名前を取得します。
53// このメソッドは、クラスが実装しているインターフェース名の文字列の配列を返します。
54$loggerInterfaceNames = $loggerReflector->getInterfaceNames();
55
56if (empty($loggerInterfaceNames)) {
57    echo "  このクラスはどのインターフェースも実装していません。" . PHP_EOL;
58} else {
59    echo "  実装しているインターフェース:" . PHP_EOL;
60    foreach ($loggerInterfaceNames as $interfaceName) {
61        echo "    - " . $interfaceName . PHP_EOL;
62    }
63}
64
65echo PHP_EOL; // 出力を見やすくするための区切り
66
67// 6. インターフェースを実装していないクラス (SimpleService) についても同様にインターフェース情報を取得してみます。
68$serviceReflector = new ReflectionClass(SimpleService::class);
69
70echo "--- クラス '" . $serviceReflector->getName() . "' のインターフェース情報 ---" . PHP_EOL;
71$serviceInterfaceNames = $serviceReflector->getInterfaceNames();
72
73if (empty($serviceInterfaceNames)) {
74    echo "  このクラスはどのインターフェースも実装していません。" . PHP_EOL;
75} else {
76    echo "  実装しているインターフェース:" . PHP_EOL;
77    foreach ($serviceInterfaceNames as $interfaceName) {
78        echo "    - " . $interfaceName . PHP_EOL;
79    }
80}
81

PHPのReflectionClass::getInterfaceNamesメソッドは、実行時に特定のクラスがどのインターフェースを実装しているのか、その名前を取得するための機能です。ReflectionClass自体は、プログラムの実行中にクラスのプロパティ、メソッド、インターフェースといった構造情報を動的に分析・取得できる強力なツールとして使われます。

このgetInterfaceNamesメソッドは引数を一切取りません。呼び出すと、対象のクラスが実装しているすべてのインターフェースの完全修飾名(例: Loggable)を文字列の配列として返します。もし、そのクラスがどのインターフェースも実装していない場合、戻り値は空の配列となります。

サンプルコードでは、LoggableとConfigurableという二つのインターフェースを実装したDatabaseLoggerクラスと、インターフェースを実装していないSimpleServiceクラスを定義しています。DatabaseLoggerのReflectionClassオブジェクトからgetInterfaceNamesを呼び出すと、実装しているインターフェース名が配列として取得されますが、SimpleServiceの場合には空の配列が返されることで、メソッドの挙動を確認できます。この機能は、フレームワークなどでクラスの振る舞いを動的に判別し、処理を分岐させる際に活用されます。

ReflectionClass::getInterfaceNames()は、クラスが実装するインターフェース名を文字列の配列で返します。対象クラスがインターフェースを実装しない場合は空の配列を返すため、返り値は空になる場合があるので、必ず確認してください。new ReflectionClass()に存在しないクラス名を渡すとReflectionExceptionが発生しますので、実運用では例外処理が必須です。ClassName::class定数を使うとタイプミスを防げます。

関連コンテンツ

関連プログラミング言語