あまり知らないクラスのコードを読んでいると、あっちのクラスにいったり、こっちのクラスに行ったり、コレ何だったっけ?、がたくさんでて大変。で、それを説明するのも大変。 というわけで、サクッと簡単にクラスの繋がり方を可視化するような何かを書いた。
GitHub - sters/php-class-graph
書いたはいいんだけど、あんまり考えずにえいやーで作ったのでこれ以上拡張出来ない感じになってしまった… テストもちょっと書き方な〜〜〜となってしまったのでリファクタ余地は大いにあり…。
PHP のコードをパースするために nikic/PhpParser を使っている。 GitHub - nikic/PHP-Parser: A PHP parser written in PHP
それを使ってクラス呼び出しっぽいのを辿っている。このあたり。
php-class-graph/Visitor.php at master · sters/php-class-graph · GitHub
これで、あるクラスから、どのクラスを呼ぼうとしているかを記録。その記録を整理して図形データとして出力できるようになっている。
クラスっぽいのを辿る際に、クラス名からファイル名を解決するために、プロジェクトルートディレクトリを指定し、その composer autoloader を読み込んでいるのがひとつ工夫したポイント。このあたり。 php-class-graph/SourceList.php at master · sters/php-class-graph · GitHub
おしごとコードや自分のいくつかで試したけど、ちゃんとできてそう…? たとえば sters/cakephp3-aws-s3-datasource: AWS S3 datasource in CakePHP3 でやるとこういう。いやでもどこからともなく親ノードが発生するのはちょっと違う気がするなあ…、間違ってそう…。
このまま使うと、開始地点から永遠に深ぼってしまうので、どこまで辿るのが指定したほうがいい vendor 下は無視するとか。といったのも example ディレクトリに作ってみたのでお試しどうぞ。
ここから追記: 2020-03-10
実はStaticXxxをどうこうする実装がまるっとなくてバグっていた。というわけで直したらちゃんと出るようになった。
さらに example/whole_project.php というそのままで便利に使えそうなスクリプトを書いた、これでそれぞれのプロジェクトでも実行しやすくなった。と思う。ぜひお試しあれ。