PHPLintの紹介

ネット上でも言及している人が少ない印象ですが、PHPLintというツールがあります。これがどんなものか、触ってみたので紹介します。

結論から言うと仕事には使えなさそうですが、面白いソフトウェアだな、というのが個人的な感想です。

PHPLintというのは、PHPソースコードのバリデーターです。PHP4とPHP5に対応しており、独自のパーサを用いて独自のエラーを出します。独自のエラーというのは、PHPの文法上何一つ問題がないソースコードであってもエラーを出すということです。例えば、$ifや$listといった変数名があるとエラーだと言われます。PHPLintとしては、PHPのキーワードは変数名に使っちゃダメなんだそうです。

このツールの狙いですが、細かい文法チェックがしたいというよりは、どうやら静的な型の検査が目標のようです。PHPは型が動的に決まる言語ですが、実際には静的なチェックが可能な場所も多数あります。また、PHPプログラムに一定の制約をつけたり、PHPDoc形式や独自形式で型を明示したりすることで、より正確な検査を行うことができます。例えば、関数の引数について、型の不一致などを検出してくれたり、暗黙の型キャストを発見してくれたりします。また、型が明示していない場合でも、初期化文などから勝手に型を推測してくれます。

と、ここまで書くと夢のようなツールですが、実際には問題山積です。まず、実際には型の判定が厳しすぎです。既存ソースコードを検査させると、stringな変数にmixedを入れるな、など型の不一致で怒られまくります。これは型の推測の精度の問題かもしれませんが、比較的PHPDoc形式で型が明示してある場合でも結構な数のエラーが出てしまいます。PHPDocコメントの無いソースコードをチェックした場合には非現実的な数のエラーが出たりします。

とはいえ、下記のようなエラーが出ているのを見ると可能性のあるツールだよなあ、なんて思うんですよね。

test1.php:74: ERROR: comparing (string) == (string) - Hint: use `===' instead.

Install & Usage

試してみたい人のために遊びかたも紹介します。

PHPLint Packages(ページの一番下です)から、「Pure-C version of PHPLint」をダウンロードします。

展開してsrc/に移動して、

$ gcc -fnested-functions phplint.c -o phplint

で出来上がりです。私の環境では「-fnested-functions」を付けないとコンパイルが通りませんでした。適切な場所にインストールしてもいいですが、私はこの場で実験を続けました。

まず、ロードするモジュールを明示しないとPHPLintがマトモに動きませんので、そのためのファイルを作ります。私は~/php/phplint-dummy.phpというファイルを作りました。内容は下記の通りです。


この全部を指定する意味はあまり無いと思いますが、モジュールが足りなくて怒られるのが嫌だったので投げやりに作りました。あとは、チェックしたいPHPファイルをコマンド末尾に指定してphplintを起動するだけです。

$ ./phplint --modules-path ../modules ~/php/phplint-dummy.php ~/php/test1.php

PEARが必要なときなどは「–packages-path /opt/local/share/pear」とすることもできるのですが、実際にはPEAR.phpがメタメタに怒られたあげくにFATAL ERRORで停止してしまうので無意味だったりします。

また、実際に使ってみると細かい点で怒られるので悲しい気分になります。例えば、PHPファイル末尾の「?>」を省略すると怒られます。また、シングルクォートの内側で「\」を書く場合に、常に「\」と書かないと怒られます。

test2.php:3: Warning: invalid escape sequence
test2.php:4: ERROR: missing `?>'

改造したい人向けの補足

改造したい、という人はあまり居ないと思うのですが、改造したい人のためにもう少し情報を出しておきます。PHPLintは、同じ作者が作ったM2というオリジナル言語で作られています。C版のソースコードはM2から生成されたものですので、少々読みにくいかと思います。M2のソースコードも斜めに見てみましたが、独自な割にはこの手のプログラムを書くのに特化している風でもなく、あまり書きやすそうにも見えませんでした。ですので、機能拡張のような方向の改造は厳しそうに思います。

一方で、「このエラーメッセージを出さないようにする」という程度の改造であれば簡単です。ただ、エラーの種類を減らすだけで実用的になるのかというと疑問です。

参考リンク

コメント / トラックバックはありません

コメントする