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