34

PHP ファイル用の [Lint のような] 静的コード アナライザーはありますか? を参照してください。--開発者がコミットする前に、PHP ファイルの内容を評価する方法を検討しています。 適切なソリューションは、答えのような SVN フックを介してトリガーされます: PHP から PHP ファイルの構文を確認することは可能ですか?

私が目指している角度であるSVNにチェックインするときに、PHPファイルのこの自動構文チェックに出くわしましたが、...php -l十分ではありません。

たとえば、次のコードがあるとします。

if ($foo == 'bar') { 
     echo $foo;
}

これにより、次の結果が得られます。

2012/01/15 02:51:14 [エラー] 694#0: *164 FastCGI sent in stderr: "PHP Notice: Undefined variable: foo

に比べ:

if (isset($foo)) { echo $foo; }

その一部は、ベスト プラクティスについてコーダーを教育することに帰着します。残念なことに、他のものほど早く学習しないものもあり、コーディング標準への準拠を確実にする唯一の方法は、テストされていない、または準拠していない SVN に入るものを減らすことです。

この質問の最初のリンクから、私は試しました:

    if ($foo == 'bar') {
                     \_ HERE

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: 警告: 比較中 (不明) == (文字列): 不明な型間の比較を確認できません

すべてが独自の方法で興味深いものですが、実際には実行時にのみ発見されるこれらの問題を捉えているものはありません。

このトピックに関するご意見やご感想をお待ちしております。

編集

PHPLint が正しい方法であると示唆する 1 人のポスターがありました。私は思った、OK!新しいバージョンがあるのでもう一度試してみましょう: phplint-pure-c-1.1_20120202 :

 <?php
 if ($foo == 'bar') {
     echo $foo;
 }
 ?>

簡単なテスト ..........そして、それは動作し、1 つのエラー、1 つの警告を報告します。ただし、ステートメント のに次を追加すると、次のようになります。if

 <?php
 if (isset($foo) && $foo == 'bar') { echo 'man'; }
 if ($foo == 'bar') { 
     echo $foo;
 }
 ?>

動作せず、エラー 0 件、警告 2 件を報告します。

4

6 に答える 6

11

これは、アナライザーが警告を出すのが少し難しいかもしれないと思います。あなたが与えたコードは、たとえば register_globals のヘルプで動作する可能性があります。また、このファイルを含む他のファイルで定義されている可能性があります。これらの理由から、PHP ファイルを他のファイルの完全なコンテキストで分析して、これを本当に信頼できるものにする必要があります。また、PHP/サーバーの構成も分析メカニズムで利用できるか、定義されている必要があります。

そうは言っても、phplint はあなたがやりたいことをやっていないと思いますか?

テストに使用できるオンラインバリデーターがあります。入力が与えられた場合:

<?php

echo $foo;

結果は次のとおりです。

        echo $foo;
                  \_ HERE
==== 3: ERROR: variable `$foo' has not been assigned
END parsing of test-qBlPWw
==== ?: notice: unused package `dummy.php'
==== ?: notice: unused module `standard'
Overall test results: 1 errors, 0 warnings.

一方、 isset() では問題は見つかりませんでした。

編集:この他のテストケースの場合:

<?php

if ($foo == 'bar') echo $foo;

Linux Mint 8 での応答は次のとおりです。

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: ERROR: variable `$foo' has not been assigned
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types
Overall test results: 1 errors, 1 warnings.

そしてこれで:

<?php

$foo = '1';
if ($foo == 1) echo $foo;

それは:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:6: ERROR: comparing (string) == (int)
Overall test results: 1 errors, 0 warnings.

正常に動作し、問題を適切に報告していませんか?

于 2012-01-15T11:23:51.310 に答える
8

phpcs(コーディング標準に準拠するため)とSebastian Bergmannによる新しいプロジェクトを組み合わせることができます:https ://github.com/sebastianbergmann/hphpaこれは、Facebookの静的コンパイラを利用して、探しているようなエラーをチェックします。 。precommitフックとしては多すぎるかもしれませんが、ビルドシステムへのフックで十分かもしれません。

于 2012-02-07T09:36:54.540 に答える
5

すべてのドアを盗聴し、すべての鍵穴を調べるこれらすべてのスマートな超強力ツールは、コードを実行するという愚かで鈍いアクションと競合することはできません.

レポジトリにコンパイル可能で構文的に有効な php ファイルがあることの価値は何ですか? そのようなファイルを大量に作成し、それらを定期的にリポジトリにコミットすることができます。安心してください。それらはすべてプロジェクトに貢献し、特定の信頼できる機能を追加します。なぜなら、それらは pre-commit フックを介してチェックしたからです。それらの有効性は?

人間が書いたコードには問題が山積みで、構文や変数の欠落は氷山の一角にすぎません。単体テスト (@NikiC が指摘) はかなり役立ちます。信頼性が高く、機能する、文書化されたコードを作成し、コミットする前にテストするのは、開発者の責任です。宣言されていない変数を使用するというばかげた間違いは、IDE が指摘できるものです (たとえば、Zend Studio は指摘します)。あなたの目標は、適切に機能するソフトウェアを作成することあり、ここでは単体テストが重要です。私の意見では、これが主な懸念事項です。有効なphpファイルは非常に緩い要件です...

于 2012-03-10T22:54:42.293 に答える
2

phc ( http://www.phpcompiler.org/doc/latest/runningphc.html#compiling-web-applications ) のような、より多くのコンパイル時オプションを持つサード パーティ製コンパイラを使用できますか? (もしかしたらヒップホップ?)

それから私は考えました:PHPにはPerl::Criticが必要です。

PHP コード / PerlCritic for PHP を批判していますか?

(またグーグル: php の perl 評論家)

より具体的にお役に立てれば幸いですが、解決策にたどり着くのはアイデアにすぎない場合もあります。それが私が提供しなければならないものです:)

デビッド

于 2012-02-02T03:46:53.680 に答える
1

そうそう、必要なのは PHPUnderControl です! 構文をチェックし、単体テストを自動的にチェックし、CRAP インデックスを作成し、その他の優れた機能を実行します。それは基本的に爆弾です!

確認してください。URL は次のとおりです: http://phpundercontrol.org/

于 2012-04-25T01:49:39.820 に答える
0

コマンド ライン チェッカーではありませんが、PHPStormは最高の IDE の 1 つでなければなりません。

あなたが言及した種類の問題を検出できるさまざまな検査があります。また、バージョン管理にコミットしているファイルに対してこれらの検査を自動的に再実行し、未定義の変数、低品質のコード、および「todos」をチェックします。

ただし、これらの検査の問題点は、すべてを把握できるわけではないため、エラーではなく、「提案」または「警告」であるという側面で誤りを犯すことがあるということです。

ただし、その機能は非常に優れており、編集中にこの種の問題が発生する可能性があり、通常はコミットアクションの前にエラーを修正することになります。

于 2012-04-25T12:51:56.653 に答える