【PHP8.x】ReflectionObject::getMethods()メソッドの使い方
getMethodsメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMethodsメソッドは、PHPのReflectionObjectクラスに属し、指定されたオブジェクトが持つ全てのメソッドに関する情報を取得するために実行するメソッドです。
ReflectionObjectクラスは、実行時にPHPのオブジェクトの構造や挙動をプログラムから詳細に検査できるリフレクションAPIの一部です。このメソッドを利用することで、インスタンス化されたオブジェクトがどのようなメソッドを持っているのか、動的に調査することが可能になります。具体的には、getMethodsメソッドは、対象オブジェクトのパブリック、プロテクテッド、プライベート、そして静的なメソッドを含む、あらゆるメソッドに関する情報を取り出します。
戻り値は、各メソッドの詳細を表すReflectionMethodクラスのインスタンスを要素とする配列です。各ReflectionMethodオブジェクトからは、メソッド名、引数の情報、アクセスレベル、それが静的メソッドであるか否か、といった多岐にわたる情報をさらに詳しく取得できます。この機能は、フレームワークの自動処理や、IDEによるコード補完、デバッグツールの開発など、プログラムの構造を動的に解析する必要がある場面で非常に役立ちます。また、特定の条件(例えばパブリックなメソッドのみ)を満たすメソッドを抽出したい場合は、引数として適切なフィルター定数を渡すことで、取得するメソッドを絞り込むことも可能です。
構文(syntax)
1<?php 2 3$reflectionObject = new ReflectionObject(new stdClass()); 4$methods = $reflectionObject->getMethods(); 5 6?>
引数(parameters)
?int $filter = null
- ?int $filter = null: 取得するメソッドをフィルタリングするための整数。デフォルトは null で、すべてのメソッドを取得します。
戻り値(return)
ReflectionMethod[]
指定されたクラスの公開、保護、プライベートなメソッドを表す ReflectionMethod オブジェクトの配列が返されます。
サンプルコード
PHP ReflectionObject::getMethods でオブジェクトのメソッド一覧を取得する
1<?php 2 3/** 4 * オブジェクトのメソッド情報を表示するクラスです。 5 * 6 * このクラスは、ReflectionObject を使用して、任意のオブジェクトのメソッド一覧を動的に取得し表示します。 7 * システムエンジニアを目指す初心者の方にも、リフレクションの強力さを理解してもらえるように設計されています。 8 */ 9class ObjectMethodViewer 10{ 11 /** 12 * 指定されたオブジェクトのメソッド情報を取得し、コンソールに出力します。 13 * 14 * @param object $targetObject メソッド情報を調べたい対象オブジェクト 15 */ 16 public static function displayMethods(object $targetObject): void 17 { 18 // ReflectionObject のインスタンスを作成します。 19 // これにより、実行時にオブジェクトの構造(プロパティ、メソッドなど)を調べることができます。 20 $reflector = new ReflectionObject($targetObject); 21 22 echo "--- クラス '" . get_class($targetObject) . "' のメソッド一覧 ---\n"; 23 24 // getMethods() メソッドを使って、オブジェクトが持つすべてのメソッドを取得します。 25 // 引数にフィルターを渡さない場合、public, protected, private 全てのメソッドが取得されます。 26 $allMethods = $reflector->getMethods(); 27 28 if (empty($allMethods)) { 29 echo "このオブジェクトにはメソッドが見つかりませんでした。\n"; 30 } else { 31 foreach ($allMethods as $method) { 32 // 各メソッドの情報を ReflectionMethod オブジェクトから取得します。 33 echo " - 名前: " . $method->getName() . "\n"; 34 echo " アクセス修飾子: "; 35 if ($method->isPublic()) { 36 echo "public"; 37 } elseif ($method->isProtected()) { 38 echo "protected"; 39 } elseif ($method->isPrivate()) { 40 echo "private"; 41 } 42 if ($method->isStatic()) { 43 echo ", static"; 44 } 45 echo "\n"; 46 } 47 } 48 echo "------------------------------------------------------\n\n"; 49 50 // 例: public メソッドのみをフィルタリングして取得する 51 echo "--- クラス '" . get_class($targetObject) . "' の public メソッド一覧 ---\n"; 52 // getMethods() の引数に ReflectionMethod::IS_PUBLIC を指定すると、 53 // public なメソッドのみに絞り込むことができます。 54 $publicMethods = $reflector->getMethods(ReflectionMethod::IS_PUBLIC); 55 56 if (empty($publicMethods)) { 57 echo "このオブジェクトには public メソッドが見つかりませんでした。\n"; 58 } else { 59 foreach ($publicMethods as $method) { 60 echo " - 名前: " . $method->getName() . "\n"; 61 } 62 } 63 echo "------------------------------------------------------\n"; 64 } 65} 66 67// -------------------------------------------------------------------------- 68// サンプルコードの実行部分 69// -------------------------------------------------------------------------- 70 71// 検査対象となるサンプルクラスを定義します 72class Product 73{ 74 public string $name; 75 private float $price; 76 protected string $sku; 77 78 public function __construct(string $name, float $price) 79 { 80 $this->name = $name; 81 $this->price = $price; 82 $this->sku = uniqid('prod_'); 83 } 84 85 /** 86 * 商品名と価格を含む文字列を返します。 87 */ 88 public function getProductInfo(): string 89 { 90 return "商品名: {$this->name}, 価格: {$this->price}円"; 91 } 92 93 /** 94 * 価格を設定します。(プライベートメソッド) 95 */ 96 private function setPrice(float $newPrice): void 97 { 98 if ($newPrice > 0) { 99 $this->price = $newPrice; 100 } 101 } 102 103 /** 104 * SKU情報を返します。(プロテクテッドメソッド) 105 */ 106 protected function getSku(): string 107 { 108 return $this->sku; 109 } 110 111 /** 112 * 商品を比較します。(静的メソッド) 113 */ 114 public static function compare(Product $p1, Product $p2): string 115 { 116 return $p1->name . ($p1->price > $p2->price ? "は" . $p2->name . "より高価です。" : "は" . $p2->name . "より安価です。"); 117 } 118} 119 120// Product クラスのインスタンスを作成します 121$myProduct = new Product("高性能PC", 150000.00); 122 123// ObjectMethodViewer クラスの静的メソッドを呼び出し、 124// myProduct オブジェクトのメソッド情報を表示します。 125ObjectMethodViewer::displayMethods($myProduct);
PHPのReflectionObject::getMethodsメソッドは、プログラムが実行されている最中に、特定のオブジェクトが持つメソッドの情報を動的に取得するために利用されます。これは「リフレクション」と呼ばれる機能の一部で、オブジェクトの構造や挙動を調べる際に非常に強力なツールとなります。
このメソッドは、ReflectionObjectクラスのインスタンスから呼び出されます。引数$filterは省略可能で、デフォルトでnullが設定されています。引数を指定しない場合、対象オブジェクトが持つpublic、protected、privateを含む全てのメソッドが返されます。もし引数にReflectionMethod::IS_PUBLICのような定数を指定すると、publicメソッドのみといった形で、特定のアクセス修飾子を持つメソッドに絞り込んで取得することができます。
戻り値は、ReflectionMethodオブジェクトの配列です。このReflectionMethodオブジェクトは、取得された各メソッドに関する詳細な情報(メソッドの名前、アクセス修飾子、静的メソッドかどうかなど)を保持しており、これらの情報を用いてメソッドの特性を調べたり、実行時の挙動を制御したりすることが可能です。サンプルコードでは、引数なしで全てのメソッドを取得する例と、ReflectionMethod::IS_PUBLICを用いてpublicメソッドのみを抽出する例が具体的に示されており、リフレクションの基本的な利用方法が理解できるようになっています。
ReflectionObject::getMethods()は、実行時にオブジェクトのメソッド情報を動的に取得する高度な機能です。引数を省略すると、public、protected、private全てのメソッドが取得されますが、ReflectionMethod::IS_PUBLICなどのフィルター定数を使えば特定のアクセス修飾子を持つメソッドに絞り込めます。この機能はデバッグやフレームワーク開発で有用ですが、通常のビジネスロジックで多用するとコードが複雑になり、パフォーマンス低下を招く可能性があります。プライベートやプロテクテッドメソッドの情報も取得できますが、これらのメソッドは本来内部利用を想定しており、リフレクションを使って外部から無理に操作することは避けるべきです。
PHP ReflectionObject::getMethods でクラスのメソッドを調べる
1<?php 2 3/** 4 * リフレクションの対象となるサンプルクラス 5 */ 6class SampleClass 7{ 8 /** 9 * これは公開(public)メソッドです。 10 */ 11 public function publicMethod(): string 12 { 13 return "これは公開メソッドです。"; 14 } 15 16 /** 17 * これは保護(protected)メソッドです。 18 */ 19 protected function protectedMethod(): string 20 { 21 return "これは保護メソッドです。"; 22 } 23 24 /** 25 * これは非公開(private)メソッドです。 26 */ 27 private function privateMethod(): string 28 { 29 return "これは非公開メソッドです。"; 30 } 31 32 /** 33 * これは静的(static)な公開メソッドです。 34 */ 35 public static function staticPublicMethod(): string 36 { 37 return "これは静的公開メソッドです。"; 38 } 39} 40 41/** 42 * 指定されたオブジェクトのメソッド情報をリフレクションを使って表示する関数 43 * 44 * @param object $object メソッド情報を取得する対象のオブジェクト 45 */ 46function displayObjectMethods(object $object): void 47{ 48 echo "--- オブジェクト '" . get_class($object) . "' のメソッド情報 ---" . PHP_EOL; 49 50 // ReflectionObjectのインスタンスを作成 51 // これにより、実行時にオブジェクトの構造を調べることができる 52 $reflectionObject = new ReflectionObject($object); 53 54 echo PHP_EOL . "◆ すべてのメソッド:" . PHP_EOL; 55 // getMethods() を引数なしで呼び出すと、すべてのメソッド(public, protected, private)が返される 56 $allMethods = $reflectionObject->getMethods(); 57 if (empty($allMethods)) { 58 echo " メソッドがありません。" . PHP_EOL; 59 } else { 60 foreach ($allMethods as $method) { 61 echo " - " . $method->getName() . PHP_EOL; 62 } 63 } 64 65 echo PHP_EOL . "◆ 公開(public)メソッドのみ:" . PHP_EOL; 66 // getMethods() に ReflectionMethod::IS_PUBLIC フィルターを適用すると、公開メソッドのみが返される 67 $publicMethods = $reflectionObject->getMethods(ReflectionMethod::IS_PUBLIC); 68 if (empty($publicMethods)) { 69 echo " 公開メソッドがありません。" . PHP_EOL; 70 } else { 71 foreach ($publicMethods as $method) { 72 echo " - " . $method->getName() . PHP_EOL; 73 } 74 } 75 76 echo PHP_EOL . "◆ 保護(protected)メソッドのみ:" . PHP_EOL; 77 // getMethods() に ReflectionMethod::IS_PROTECTED フィルターを適用すると、保護メソッドのみが返される 78 $protectedMethods = $reflectionObject->getMethods(ReflectionMethod::IS_PROTECTED); 79 if (empty($protectedMethods)) { 80 echo " 保護メソッドがありません。" . PHP_EOL; 81 } else { 82 foreach ($protectedMethods as $method) { 83 echo " - " . $method->getName() . PHP_EOL; 84 } 85 } 86 87 echo PHP_EOL . "◆ 非公開(private)メソッドのみ:" . PHP_EOL; 88 // getMethods() に ReflectionMethod::IS_PRIVATE フィルターを適用すると、非公開メソッドのみが返される 89 $privateMethods = $reflectionObject->getMethods(ReflectionMethod::IS_PRIVATE); 90 if (empty($privateMethods)) { 91 echo " 非公開メソッドがありません。" . PHP_EOL; 92 } else { 93 foreach ($privateMethods as $method) { 94 echo " - " . $method->getName() . PHP_EOL; 95 } 96 } 97 98 echo PHP_EOL . "◆ 静的(static)メソッドのみ:" . PHP_EOL; 99 // getMethods() に ReflectionMethod::IS_STATIC フィルターを適用すると、静的メソッドのみが返される 100 $staticMethods = $reflectionObject->getMethods(ReflectionMethod::IS_STATIC); 101 if (empty($staticMethods)) { 102 echo " 静的メソッドがありません。" . PHP_EOL; 103 } else { 104 foreach ($staticMethods as $method) { 105 echo " - " . $method->getName() . PHP_EOL; 106 } 107 } 108 109 echo PHP_EOL . "-----------------------------------" . PHP_EOL; 110} 111 112// サンプルクラスのインスタンスを作成 113$myObject = new SampleClass(); 114 115// メソッド情報を表示する関数を呼び出す 116displayObjectMethods($myObject); 117 118?>
PHPのリフレクション機能は、プログラムの実行中にクラスやメソッド、プロパティなどの構造を調べることができる強力な機能です。その中でもReflectionObjectクラスは、特定のオブジェクトの内部情報を取得するために使用されます。
ReflectionObject::getMethodsメソッドは、このReflectionObjectインスタンスが表すオブジェクトが持つメソッドの一覧を取得する役割を持ちます。引数にはオプションで整数型の$filterを指定できます。この$filterにReflectionMethod::IS_PUBLICやReflectionMethod::IS_PROTECTED、ReflectionMethod::IS_PRIVATE、ReflectionMethod::IS_STATICといった定数を渡すことで、公開、保護、非公開、静的といった特定のアクセス修飾子や特性を持つメソッドのみを抽出して取得できます。引数を指定しない場合は、すべてのメソッドが対象となります。戻り値は、取得された各メソッドに関する詳細情報を持つReflectionMethodオブジェクトの配列です。
このサンプルコードでは、SampleClassというオブジェクトを作成し、ReflectionObject::getMethodsメソッドを引数なしや、異なるフィルター定数(IS_PUBLIC、IS_PROTECTEDなど)とともに呼び出すことで、様々な種類のメソッド情報を動的に取得し、その名前を表示しています。これにより、プログラムの挙動を解析したり、柔軟なシステムを構築したりする際に活用できます。
ReflectionObject::getMethods()は、実行中のプログラム内で、オブジェクトがどのようなメソッドを持っているかを知りたいときに使います。引数なしで呼び出すと、公開、保護、非公開のすべてのメソッド情報が取得できます。特定のアクセス権限(public, protected, private)や特性(static)を持つメソッドだけを知りたい場合は、ReflectionMethod::IS_PUBLICなどの定数を引数に指定してください。複数の条件を組み合わせる場合は、|(OR演算子)を使って定数をつなげます。戻り値はReflectionMethodオブジェクトの配列ですので、各オブジェクトからgetName()でメソッド名などを確認します。このリフレクション機能は非常に便利ですが、通常の処理と比べて少し手間がかかるため、頻繁な利用は避け、フレームワーク開発やデバッグ用途で活用するのが一般的です。