2016-06-21 2 views
1

は、次の2つのファイルを考えてみましょうさて、これらを掘り下げてみましょうファイル:PHPリントモードは、互換性のない宣言のエラーをキャッチしません

$ php -l ParentClass.php 
No syntax errors detected in ParentClass.php 

$ php -l ChildClass.php 
No syntax errors detected in ChildClass.php 

偉大な、構文エラーはありません!

お待ちください!問題があります:

$ php ChildClass.php 
PHP Fatal error: Declaration of ChildClass::foo(array $arg1) must be compatible 
with ParentClass::foo(array $arg1, array $arg2) in 
/home/mkasberg/php_syntax_check/ChildClass.php on line 5 

なぜ、php -lはそれをキャッチしませんでしたか?これは "コンパイル時"に捕まえることができるエラーです(ただし、PHPはコンパイルされた言語ではありません)。 php -lのように、宣言に互換性がないことがわかります。このエラーをキャッチするようにphp -lを実行する方法はありますか?エラーをキャッチする別のツールがありますか?

答えて

1

lint操作は構文チェックのみを行います。パーサがParentClassについて何も知らないように、コードを実行しません。あなたが単一のファイルにクラス定義の両方を置けば

しかし、その後のエラーが表示されます:PHPのドキュメントから

$ php -l test.php 

Fatal error: Declaration of ChildClass::foo() must be compatible with ParentClass::foo(array $arg1, array $arg2) in test.php on line .. 

Errors parsing test.php 

からCommand line options

-l --syntaxチェックを
与えられたPHPコードの構文チェックだけを実行する便利な方法を提供します。成功すると、No syntax errors detected inというテキストが標準出力に書き込まれ、シェルの戻りコードは0です。失敗すると、内部パーサー・エラー・メッセージに加えてErrors parsingというテキストが標準出力に書き込まれ、シェル戻りコードが設定されます〜-1になります。

このオプションでは、未定義関数などの致命的なエラーは検出されません。致命的なエラーもテストするには、-fを使用します。

(-fオプションが実際にスクリプトを実行することに注意してください。)それは、同じファイル内のエラーをキャッチします

+0

グッド観察。残念ながら、それはうまく拡張できません。この例はちょっと工夫されています - 私はずっと大きなプロジェクトでこれをやることに本当に興味があります。 – mkasberg

+1

はい、それはちょうど 'php -l'がどのように動作するかを実証することでした。 http://stackoverflow.com/questions/378959/is-there-a-static-code-analyzer-like-lint-for-php-files – ShiraNai7

+0

ファンは興味深いようです。おそらく、私はPHP 7にアップグレードした後にそれを使い始めるでしょう。 – mkasberg

関連する問題