php-class-diagram のPHPソースコードの情報取得方法変更 php-parser

PHPでjigのようなことをしたくて作っているphp-class-diagramで、PHPソースコードの情報を取得する方法を変更しました。

PHPのソースコードからクラス関連図を出力するphp-class-diagram を作っています。(jig inspire)

元々、PHPのソースコードをrequired_onceで読み込んで、リフレクションでクラスの情報を取得していたけど、実際に調査対象のクラスをロードしてしまう故のいくつかの問題があったので、そのままではまずいなという思いはありました。

  • ソースコードを読み込むと、フレームワーク等の別のクラスを読もうとしてエラーになることがある。
  • そもそも、php-class-diagram自体の環境にシンボル等を読み込んでしまうので、動作を変えられてしまう可能性がある。

それを解決するためには、対象のPHPソースコードに対して yacc と bison で行なうようなパースを自前で行なわないといけないか?と思って、composer でパッケージを検索したところ、素晴しいものを見付けた。

php-parser

自分で解析するまでもなく、もう、欲しいものそのまんまでした。

リフレクションでクラス情報を取得していた処理を、そのままphp-parserを使ったコードに置きかえて、とりあえず動作させるまで特に問題なし。ドキュメントとかを参照する訳でもなく、パースした結果を見ながら、行き当りばったりで書いたので、直すことにはなりそうだけど。

これで、実際に運用しているソースコードに対してもPlantUMLのスクリプトを出力できるようになりました。 今回対象にしたのは元々PHP5系で運用されていたプロジェクトでほとんど型情報を書いてないソースコード群なので、依存の矢印は全く出力されていない(型情報がないので仕方ない)けど、ディレクトリ構成をパッケージと見做して各クラスを配置することはできるようになってます。

1点PlantUMLのパッケージ名が同じになると、PlantUMLで画像生成時に No package or namespace defined. というエラーが出ました。 例えば、php-class-diagram の引数に指定する対象ディレクトリの配下に、別のディレクトリ配下に、同名のディレクトリが存在するような場合に上記のエラーが出ました。

回避策として、パッケージ名が重複したら、suffixに _ を付けてPlantUMLに別のパッケージと認識させるようにしました。 (これ、PlantUMLのドキュメントを調べたら本当はもっと正しい回避方法がありそう)

次は、1対多の関係の依存を表現できるようにしたいですが、そもそもPHP7.4で、型情報の定義はどこまでできるのか、PHP8ならどこまでか、コメントに仕込むPHPDocでの型表現はどうなっているのか、等々、調べる必要がありそう。

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.