当記事ではPHPでクラスメソッドが要求している引数の種類(クラス名や型)を取得する方法について記します。
やりたいこと
PHPでは以下のようにクラスメソッドの引数にクラス名や型を指定する事ができます。
メソッドが要求している引数のクラス名や型を取得する事を目指します。
class SampleClass{
public function sampleMethod(SmapleClass2 $arg1, array $arg2){
}
}
ReflectionMethodクラスを使う方法
調べたいクラスの名前とメソッド名を引数に指定してReflectionMethodクラスのインスタンスを生成します。
getParametersメソッドでReflectionParameterオブジェクトの配列を取得できます。
getTypeメソッドで引数の種類を取得できます。
$reflection = new ReflectionMethod('SampleClass', 'sampleMethod'); // ReflectionMethodオブジェクト
$parameters = $reflection->getParameters(); // ReflectionParameterオブジェクトの配列
echo $parameters[0]->getType(); // 第一引数の種類を取得
echo $parameters[1]->getType(); // 第二引数の種類を取得
ReflectionParameterクラスを使う方法
ReflectionParameterオブジェクトを直接生成する事もできます。
第一引数にクラス名とメソッドの配列、第二引数に何個目の引数か、を指定してインスタンスを生成します。
getTypeメソッドで引数の種類を取得できます。
echo (new ReflectionParameter(['SampleClass', 'sampleMethod'], 0))->getType(); // 第一引数の種類を取得
echo (new ReflectionParameter(['SampleClass', 'sampleMethod'], 1))->getType(); // 第二引数の種類を取得
getTypeメソッドについての補足
getTypeメソッドの実際の返り値はReflectionNamedTypeオブジェクトになりますが、内部的に__toStringメソッドが実装されているため、文字列としても扱う事が出来ています。
var_dumpで確認するとReflectionNamedTypeが返っていることを確認できます。
$typeOfArg1 = (new ReflectionParameter(['SampleClass', 'sampleMethod'], 0))->getType();
echo $typeOfArg1; // SampleClass2(文字列)
var_dump($typeOfArg1); // ReflectionNamedType(オブジェクト)
class SampleClass{
public function sampleMethod(SmapleClass2 $arg1, array $arg2){
}
}
正式に文字列として取得するためにgetNameメソッドを使用する事もできます。
$typeOfArg1 = (new ReflectionParameter(['SampleClass', 'sampleMethod'], 0))->getType();
echo $typeOfArg1; // SampleClass2(文字列)
var_dump($typeOfArg1->getName()); // SampleClass2(文字列)
class SampleClass{
public function sampleMethod(SmapleClass2 $arg1, array $arg2){
}
}
関数化して使う
関数化しておくと便利かなと思いますので、一例を載せておきます。
※PHP7.4未満の場合は、最後の行のアロー関数の部分は普通の関数に書き換えてください。
// 指定した引数の種類を取得
function getMethodArgType($class, $method, $position){
return (string)(new ReflectionParameter([$class, $method], $position))->getType();
}
// すべての引数の種類を配列で取得
function getMethodArgTypeAll($class, $method){
$reflection = new ReflectionMethod($class, $method);
$parameters = $reflection->getParameters();
return array_map(fn($param) => (string) $param->getType(), $parameters);
}
以上、PHPでクラスメソッドが要求している引数の種類を取得する方法でした!