【PHP8.x】get_class_methods関数の使い方

get_class_methods関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

get_class_methods関数は、指定されたクラスまたはオブジェクトのメソッド名を配列として返す関数です。この関数は、PHPの内部関数として提供されており、クラスやオブジェクトが持つメソッドを調査する際に利用されます。引数には、クラス名を表す文字列、またはオブジェクトそのものを指定します。クラス名を文字列で指定した場合、そのクラスのすべてのメソッドが返されます。オブジェクトを指定した場合は、そのオブジェクトのクラスに定義されたメソッドが返されます。

返り値は、メソッド名の文字列を要素とする配列です。配列の順序は、クラス定義におけるメソッドの定義順序に依存します。メソッドが定義されていない場合、空の配列が返されます。この関数は、親クラスから継承されたメソッドも返します。特定のメソッドの存在を確認したり、クラスのAPIを調査したりする際に役立ちます。

get_class_methods関数を使用することで、動的にクラスの構造を調べることが可能になり、柔軟なプログラミングを実現できます。例えば、特定のインターフェースを実装しているクラスが、必要なメソッドをすべて実装しているか確認するような用途にも利用できます。エラーが発生した場合、例えば指定されたクラスが存在しない場合や、引数の型が正しくない場合などには、E_WARNINGレベルのエラーが発生します。この関数は、リフレクションAPIを使用するよりも簡潔にメソッド一覧を取得できるため、簡単な調査には特に便利です。

構文(syntax)

1get_class_methods(object|string $object_or_class): array|false

引数(parameters)

object|string $object_or_class

  • object|string $object_or_class: メソッドの一覧を取得したいオブジェクトまたはクラス名を指定します。

戻り値(return)

array

指定されたクラスに定義されているすべての公開メソッドの名前を配列で返します。

サンプルコード

PHP get_class_methods()でクラスメソッド一覧を取得する

1<?php
2
3/**
4 * get_class_methods() 関数をデモンストレーションするためのサンプルクラスです。
5 * public, protected, private, static な様々なアクセス修飾子のメソッドを含みます。
6 */
7class MyExampleClass
8{
9    // コンストラクタもメソッドとして認識されます
10    public function __construct()
11    {
12        // 初期化処理など
13    }
14
15    /**
16     * 公開メソッド
17     */
18    public function publicMethod(): void
19    {
20        // ...
21    }
22
23    /**
24     * 保護メソッド
25     */
26    protected function protectedMethod(): void
27    {
28        // ...
29    }
30
31    /**
32     * 非公開メソッド
33     */
34    private function privateMethod(): void
35    {
36        // ...
37    }
38
39    /**
40     * 静的メソッド
41     */
42    public static function staticMethod(): void
43    {
44        // ...
45    }
46}
47
48/**
49 * PHP の get_class_methods() 関数の使い方を初心者向けに示します。
50 * クラス名文字列とオブジェクトインスタンスのどちらを引数にしても動作することをデモンストレーションします。
51 */
52function demonstrateGetClassMethodsExample(): void
53{
54    echo "--- get_class_methods() 関数のデモンストレーション ---\n\n";
55
56    // 1. クラス名を文字列で指定してメソッド一覧を取得
57    echo "### 1. クラス名 'MyExampleClass' を直接指定した場合:\n";
58    $classMethods = get_class_methods('MyExampleClass');
59    echo "MyExampleClass で定義されているメソッド:\n";
60    print_r($classMethods);
61    echo "\n";
62
63    // 2. クラスのオブジェクトインスタンスを作成し、それからメソッド一覧を取得
64    echo "### 2. MyExampleClass のオブジェクトインスタンスを指定した場合:\n";
65    $myObject = new MyExampleClass();
66    $objectMethods = get_class_methods($myObject);
67    echo "MyExampleClass のオブジェクトから取得したメソッド:\n";
68    print_r($objectMethods);
69    echo "\n";
70
71    echo "--------------------------------------------------------\n";
72    echo "補足:\n";
73    echo "- `get_class_methods()` は、public, protected, private, static の\n";
74    echo "  アクセス修飾子に関わらず、そのクラスで定義されている全てのメソッド名を返します。\n";
75    echo "- コンストラクタ (`__construct`) のようなマジックメソッドも含まれます。\n";
76}
77
78// デモンストレーション関数を実行します。
79demonstrateGetClassMethodsExample();
80
81?>

PHPのget_class_methods関数は、指定されたクラスが持つ全てのメソッド名を文字列の配列として取得します。この関数は、引数としてクラスの「名前(文字列)」または「オブジェクトインスタンス」のどちらかを受け入れます。

例えば、MyExampleClassというクラスがある場合、get_class_methods('MyExampleClass')のようにクラス名を直接指定するか、$myObject = new MyExampleClass();のようにインスタンスを作成してからget_class_methods($myObject)としてインスタンスを渡すことができます。

戻り値は、そのクラスで定義されているメソッド名の配列です。このメソッド一覧には、publicprotectedprivatestaticといったアクセス修飾子の区別なく、そのクラスが持つ全てのメソッドが含まれます。また、__constructのようなコンストラクタ(マジックメソッド)もリストに含まれる点が特徴です。

サンプルコードでは、MyExampleClassに定義された様々なアクセス修飾子を持つメソッドが、クラス名を文字列で指定した場合と、オブジェクトインスタンスを指定した場合の両方で、get_class_methods関数によって正しく取得されることを示しています。これにより、クラスがどのようなメソッドを持っているかを動的に調べることができます。

get_class_methods()関数は、指定したクラスやオブジェクトが持つ全てのメソッド名を配列で返します。初心者の方は、publicメソッドのみが取得されると誤解しやすいですが、実際にはpublicprotectedprivateといったアクセス修飾子に関わらず、そのクラスで定義されているすべてのメソッド名が含まれます。また、__constructのような特殊なマジックメソッドもリストに含まれる点にご注意ください。引数にはクラス名の文字列、またはクラスのオブジェクトインスタンスのどちらでも指定できますので、利用シーンに合わせて使い分けてください。この関数は、クラスの内部構造をプログラム的に知るための基本的なツールとして活用できます。

PHP get_class_methods でクラスのメソッドを取得する

1<?php
2
3/**
4 * このスクリプトは、PHPの get_class_methods() 関数を使用して、
5 * クラスやオブジェクトが持つメソッドのリストを取得する方法を示します。
6 */
7
8// サンプル用のクラスを定義します。
9class SampleClass
10{
11    // public メソッドは get_class_methods() で取得されます。
12    public function publicMethodA()
13    {
14        return 'これはpublicメソッドAです。';
15    }
16
17    // public 静的メソッドも get_class_methods() で取得されます。
18    public static function staticPublicMethodB()
19    {
20        return 'これはpublic静的メソッドBです。';
21    }
22
23    // protected メソッドはデフォルトでは get_class_methods() で取得されません。
24    protected function protectedMethodC()
25    {
26        return 'これはprotectedメソッドCです。';
27    }
28
29    // private メソッドもデフォルトでは get_class_methods() で取得されません。
30    private function privateMethodD()
31    {
32        return 'これはprivateメソッドDです。';
33    }
34}
35
36echo "--- クラス名からメソッドを取得する場合 ---" . PHP_EOL;
37
38// クラス名(文字列)を引数として get_class_methods() を呼び出します。
39// この場合、SampleClass の public メソッドのみが配列として返されます。
40$methodsFromClassName = get_class_methods('SampleClass');
41
42echo "SampleClassのメソッドリスト (クラス名指定):" . PHP_EOL;
43print_r($methodsFromClassName);
44echo PHP_EOL;
45
46echo "--- オブジェクトからメソッドを取得する場合 ---" . PHP_EOL;
47
48// SampleClass のオブジェクトインスタンスを作成します。
49$sampleObject = new SampleClass();
50
51// オブジェクトを引数として get_class_methods() を呼び出します。
52// この場合も、SampleClass の public メソッドのみが配列として返されます。
53$methodsFromObject = get_class_methods($sampleObject);
54
55echo "SampleClassのメソッドリスト (オブジェクト指定):" . PHP_EOL;
56print_r($methodsFromObject);
57echo PHP_EOL;
58
59// get_class_methods() 関数は、デフォルトで public メソッドのみを返します。
60// protected や private メソッドは含まれないことに注意してください。
61// 静的メソッドも public であれば結果に含まれます。
62
63?>

PHPのget_class_methods関数は、特定のクラスやオブジェクトが持つメソッドの名前をリストとして取得するために使用されます。引数には、クラスの名前を文字列で指定するか、そのクラスのオブジェクトインスタンスを直接渡すことができます。この関数は、取得されたメソッドの名前が文字列として格納された配列を返します。

サンプルコードでは、SampleClassというクラスを定義し、public、protected、private、そしてstatic publicの様々なアクセス修飾子を持つメソッドを含めました。get_class_methods関数をクラス名「SampleClass」で呼び出した場合でも、SampleClassのオブジェクトを引数として渡した場合でも、結果は同じになります。どちらの場合も、publicMethodAstaticPublicMethodBというpublicなメソッドのみが配列として返されます。重要な点として、protectedMethodCprivateMethodDのようにpublicではないメソッドは、デフォルトでは結果に含まれません。この関数は、プログラム実行時に動的にクラスのメソッド構成を調べたい場合などに役立ちます。

PHPのget_class_methods()関数は、指定したクラスやオブジェクトが持つpublicなメソッドの名前を配列として取得します。最も重要な注意点は、この関数が**publicメソッドのみを返す**ことです。protectedprivateで定義されたメソッドは、デフォルトでは結果に含まれませんのでご注意ください。publicな静的メソッドも、通常のpublicメソッドと同様にリストに含まれます。引数には、クラスのインスタンス(オブジェクト)またはクラス名(文字列)のどちらかを指定できますが、どちらの場合も結果は同じです。この特性により、外部からアクセス可能なメソッドのみを安全に確認できます。

PHP: クラス自身のメソッドのみ取得する

1<?php
2
3// 親クラスを定義します
4class ParentClass
5{
6    public function parentMethod1(): string
7    {
8        return "Parent method 1";
9    }
10
11    protected function parentMethod2(): string
12    {
13        return "Parent method 2";
14    }
15
16    // private メソッドは get_class_methods の通常の呼び出しではリストされません。
17    private function parentMethod3(): string
18    {
19        return "Parent method 3";
20    }
21}
22
23// 子クラスを定義します。ParentClassを継承します。
24class ChildClass extends ParentClass
25{
26    public function childMethodA(): string
27    {
28        return "Child method A";
29    }
30
31    public function childMethodB(): string
32    {
33        return "Child method B";
34    }
35
36    // 親クラスのメソッドをオーバーライドします。
37    // get_class_methods はメソッド名をリストしますが、
38    // array_diff を使用して親メソッドを除外する場合、同名のメソッドは除外される点に注意してください。
39    public function parentMethod1(): string
40    {
41        return "Child overridden parent method 1";
42    }
43}
44
45/**
46 * 指定されたクラスに直接定義されているメソッドのみを取得する関数。
47 * 親クラスから継承されたメソッドは除外します。
48 *
49 * 注意: この関数は get_class_methods の結果 (メソッド名のみの配列) を使用するため、
50 * 親クラスと子クラスで同名のメソッド (オーバーライドされたメソッド) は、
51 * array_diff の比較により除外されます。
52 * つまり、子クラスで新たに定義されたメソッドのみを抽出したい場合に適しています。
53 * オーバーライドされたメソッドも「自身のメソッド」として含めたい場合は、
54 * Reflection API を使用する必要があります。
55 *
56 * @param string $className メソッドを取得するクラスの名前 (例: MyClass::class)
57 * @return array クラスに直接定義されているメソッド名の配列 (オーバーライドされた同名メソッドは除外される可能性があります)
58 */
59function getOwnMethods(string $className): array
60{
61    // 指定されたクラスのすべてのメソッド名を取得します (継承されたメソッドを含む)
62    // get_class_methods は通常、public および protected メソッドを返します。
63    $allMethods = get_class_methods($className);
64
65    // 親クラスの名前を取得します
66    $parentClass = get_parent_class($className);
67
68    if ($parentClass) {
69        // 親クラスのすべてのメソッド名を取得します
70        $parentMethods = get_class_methods($parentClass);
71        // 子クラスのメソッド名リストから、親クラスに存在するメソッド名を除外します。
72        // ここで、子クラスでオーバーライドされた同名のメソッドも除外されます。
73        $ownMethods = array_diff($allMethods, $parentMethods);
74    } else {
75        // 親クラスがない場合、すべてのメソッドがそのクラス自身のメソッドです
76        $ownMethods = $allMethods;
77    }
78
79    // array_diff はキーを保持するため、キーをリセットして返します
80    return array_values($ownMethods);
81}
82
83// --- 使用例 ---
84
85echo "=== ChildClassのすべてのメソッド (継承されたもの、オーバーライドされたものを含む) ===\n";
86// get_class_methodsは、自身と親クラスのpublic/protectedメソッドをすべて返します
87print_r(get_class_methods(ChildClass::class));
88echo "\n";
89
90echo "=== ParentClassのすべてのメソッド ===\n";
91print_r(get_class_methods(ParentClass::class));
92echo "\n";
93
94echo "=== ChildClassに直接定義されているメソッドのみ (getOwnMethods関数を使用) ===\n";
95// getOwnMethods関数を使用して、ChildClassに直接定義されているメソッドのみを取得します。
96// オーバーライドされた parentMethod1 は除外されます。
97print_r(getOwnMethods(ChildClass::class));
98echo "\n";
99
100echo "=== 参考: ParentClassに直接定義されているメソッドのみ ===\n";
101// ParentClassには親がないため、get_class_methodsと同じ結果になります
102print_r(getOwnMethods(ParentClass::class));
103echo "\n";
104
105?>

PHPのget_class_methods関数は、指定されたクラスまたはオブジェクトが持つメソッドの名前を文字列の配列として取得する際に使用します。引数にはクラス名を文字列で渡すか、オブジェクトを直接指定します。戻り値は、そのクラスがアクセス可能なpublicおよびprotectedなメソッド名の配列です。この関数は、自身のクラスに定義されたメソッドだけでなく、親クラスから継承されたメソッドもすべて含めてリストします。

もし、親クラスから継承されたメソッドを除外し、そのクラス自身に直接定義されているメソッドのみを取得したい場合は、追加の処理が必要です。サンプルコードのgetOwnMethods関数はこのニーズに応えるものです。この関数では、まずget_class_methodsで対象クラスの全メソッドを取得します。次に、get_parent_class関数で親クラス名を取得し、親クラスのメソッドも同様にget_class_methodsで取得します。最後に、array_diff関数を用いて対象クラスのメソッドリストから親クラスのメソッドリストを除外することで、自身に定義されたメソッドのみを抽出します。ただし、この方法では、子クラスで親クラスのメソッドをオーバーライドしている場合、同名のメソッドとして扱われるため、そのオーバーライドされたメソッドも除外されてしまう点に留意してください。

get_class_methods関数は、指定したクラスまたはオブジェクトが持つpublicおよびprotectedメソッド名を配列で返します。privateメソッドは通常の呼び出しでは含まれません。サンプルコードのgetOwnMethods関数では、array_diffを使って親クラスのメソッドを除外しています。このため、子クラスで親クラスのメソッドをオーバーライドしている場合、同名のメソッドは親と子で共通とみなされ、除外される点に特に注意が必要です。オーバーライドされたメソッドも「子クラス自身が定義したメソッド」として取得したい場合は、PHPのReflection APIなど、より詳細な情報を取得できる別の方法を検討してください。また、array_diffはキーを保持するため、結果を確実に0からの連番インデックスの配列にしたい場合はarray_valuesでキーをリセットすると良いでしょう。

PHPのget_class_methodsでクラスのメソッド一覧を取得する

1<?php
2
3/**
4 * サンプルクラス
5 * get_class_methods の動作を確認するために使用します。
6 */
7class MySampleClass
8{
9    public function publicMethod(): void
10    {
11        // 公開メソッド
12    }
13
14    protected function protectedMethod(): void
15    {
16        // 保護メソッド
17    }
18
19    private function privateMethod(): void
20    {
21        // プライベートメソッド
22    }
23
24    public static function staticMethod(): void
25    {
26        // 静的メソッド
27    }
28}
29
30// クラス名を文字列で指定してメソッド一覧を取得
31echo "--- クラス名 'MySampleClass' を指定した場合 ---" . PHP_EOL;
32$methods_from_string = get_class_methods('MySampleClass');
33if ($methods_from_string !== false) {
34    foreach ($methods_from_string as $method) {
35        echo "- " . $method . PHP_EOL;
36    }
37} else {
38    echo "メソッドの取得に失敗しました。" . PHP_EOL;
39}
40
41echo PHP_EOL;
42
43// オブジェクトインスタンスを渡してメソッド一覧を取得
44echo "--- MySampleClass のオブジェクトインスタンスを渡した場合 ---" . PHP_EOL;
45$object_instance = new MySampleClass();
46$methods_from_object = get_class_methods($object_instance);
47if ($methods_from_object !== false) {
48    foreach ($methods_from_object as $method) {
49        echo "- " . $method . PHP_EOL;
50    }
51} else {
52    echo "メソッドの取得に失敗しました。" . PHP_EOL;
53}
54
55?>

PHPのget_class_methods関数は、指定されたクラスに定義されているすべてのメソッドの名前を配列として取得します。この関数は、プログラム実行中にクラスの構造(リフレクション)を動的に調べたい場合に非常に便利です。

引数には、メソッド一覧を取得したいクラスの「クラス名を文字列」として渡すか、そのクラスの「オブジェクトインスタンス」を渡すことができます。どちらの方法でも、そのクラスが持つメソッドのリストを取得可能です。

戻り値は、クラスに定義されているメソッド名が格納された文字列の配列です。もし指定されたクラスが存在しないなど、メソッドの取得に失敗した場合はfalseが返されます。

サンプルコードでは、MySampleClassというクラスに定義された公開(public)、保護(protected)、プライベート(private)、静的(static)の各メソッドを例に、クラス名を直接文字列で指定する方法と、クラスのオブジェクトインスタンスを渡す方法の二通りでメソッド一覧を取得し、その結果を表示しています。これにより、アクセス修飾子に関わらず、すべてのメソッド名が取得されることを確認できます。

get_class_methods関数は、指定したクラスやオブジェクトに定義されている全てのメソッド名を取得します。公開(public)、保護(protected)、プライベート(private)、静的(static)といったアクセス修飾子に関わらず、宣言されている全てのメソッドが返される点に注意が必要です。引数にはクラス名を文字列で渡すことも、クラスのオブジェクトインスタンスを渡すこともできます。クラスが存在しない、または引数が無効な場合、この関数はfalseを返すことがあります。そのため、結果を安全に利用するためには、必ず戻り値がfalseでないかを確認してください。これにより予期せぬエラーを防ぐことができます。

関連コンテンツ