がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

PHPで「型宣言された引数の型の名前」を知る方法

元々は、Laravelで興味深い機能*1を見かけたのが初手で。
その後、(近々公開しますが)Slim4のContainerでも似たような事をやっていたので、ちぃと思い切って調査をしてみました。

端的には
・関数(メソッド)宣言で引数に型宣言をしている時に、「なんのクラスを宣言しているのか?」を知る方法
です。

んと……色々と手間を省くためにざっくりしたコードで恐縮ですが。

class Hoge {
    public function t(\Exception $e, \ArrayObject $ar, string $s, int $i) {
    }
}

こんなクラスがあった時に
・t()の、第一引数には\Exception、第二引数には\ArrayObject、第三引数にはstring、第四引数にはintが型指定されている
事を知りたい時があるわけですよ……多分、フレームワーク作ってるとかじゃないとあんまりなさそうなシチュエーションですが、フレームワークとかの「汎用系ルーチン」作ってると、こーゆーの、稀にあります。

で、調べてみたのですが……わかれば割と簡単。
Reflectionを使ってたんですねぇ(少なくとも Slim4のContainerであるPHP-DIでは。Laravelが使ってるのか「別の方法なのか」は知らにゃい)。

ざっくり、コードを書いてみました。

<?php

// 調査用クラス
class Hoge {
    public function t(\Exception $e, \ArrayObject $ar, string $s, int $i) {
    }
}
// 調査用関数
function t(\Exception $e, \ArrayObject $ar, string $s, int $i) {
}

/*
//
$ref = new \ReflectionFunction('tt');
//$ref = new \ReflectionMethod('Hoge', 't');

//
$params = $ref->getParameters();
//
foreach($params as $p) {
    echo $p->getType() , "\n";
}
*/

// 一行にまとめてみるとこんなん
foreach(( new \ReflectionMethod('Hoge', 't'))->getParameters() as $p) {
    echo $p->getType() , "\n";
}

説明は省略(笑
質問があったら、コメントにでも書いて貰えれば返答できるかと思われます。

いやわかってしまえば「あぁそりゃそうか」なんですが。
Reflection、ざっくり斜めには見てるけど、あんまり「がっぷり四つに組んで」までは見てないからなぁ。
今度、腰を据えて丁寧にじっくりとガッツリと見てみるのも面白いかもしんない。

以上、ちと興味深くて「割とず~っとうっすらと気になってた」機能の調査でした。

*1:調べたら、FormRequestと言うそうです