0

サイズが適度に大きくなり始めている小さな PHP Web ベースのアプリケーションがあります。

PHP緩い/弱い型付けの動的言語であるため、PHP コード ベースの管理に関心を持ち始めています。

他の人は、ゆるい/弱い型付けの動的言語に基づいてコードをどのように管理していますか?

コードベースでチェックを実行して、以下のようなものを識別することができる PHP 用のプリパーサーはありますか?

$var1 = 'data';
// vr1 doesn't exist, it's a typo of $var1, but PHP would allow for this and not complain
echo $vr1;

更新

上記の例は最良の例ではないかもしれませんが、本質的に伝えようとしているのは、動的に弱い型付けされた言語の特定のエラーは、コードが本番環境で RUN TIME に実行されたときにのみ見つかるということです。一方、これらの問題のいくつかは、通常、COMPILE 時に強く型付けされた静的言語で発見されます。

非常識な数の単体テストを作成することなく、コードを本番環境に移行する前に、PHP でこれらの非アルゴリズム タイプのエラーを見つけるにはどうすればよいでしょうか?

そのため、本番環境に移行する前に PHP コードを実行できる場所はありますか? このプリプロセッサはコードを解析して、定義済みの変数のみを使用していることを確認します。非アルゴリズムタイプの使用。たとえば、文字列に対して代数を実行しようとしないなど。

更新 2

ランタイムではなく「コンパイル」タイプでPHPのこれらのタイプの非アルゴリズムエラーを特定する方法を探しているため、この質問にはまだ回答がないことに注意してください。

4

8 に答える 8

10

PHP をlintできますphp -l filename.php。これにより、構文エラーが表示されます。コードを書いている間にリントする IDE があります。これらは通常、リンティングに加えて、質問に示されているような問題も検出できます。

これとは別に、コードのUnitTestsを作成して機能性を保証することを検討してください。また、 http://phpqatools.orgで、コードの品質を向上させるのに役立つ他の多くのツールを確認してください。

error_reporting(-1);enabledisplay_errorsdisplay_startup_errorsphp.iniに加えて、開発中にすべてのエラーを有効にするように設定したことを確認してください。サーバー情報の公開を防ぐために、本番システムで後者の 2 つを無効にします。

更新後の編集: PHP ソース コードはオンザフライでコンパイルされます。PHP のコンパイル時間は、事実上実行時です。コンパイル済みの PHP が必要な場合は、Facebook の HipHop を使用する必要があります。

于 2010-07-25T21:37:45.330 に答える
4

実行時エラー

初期化されていない変数はPHPの (レベルの)実行時エラーE_NOTICEであるため、実行時にのみ確認できます。コードの実行方法によっては、指定した例がエラーになる場合とそうでない場合があります。たとえば、含まれている場合と含まれていない場合がある$vr1条件で定義されている可能性がinclude()あります。

さらに、変数変数( $$var)を使用して実行時に変数を動的に作成することもできるため、これ$vr1も実際にはどこかで定義されている可能性があります。PHP インタープリターが有効な構文の実行に失敗した場合、または有効な構文でコンパイラ エラーが発生した場合、それは別の種類の問題になります。

初期化されていない変数の状況をゼロ除算エラーと比較できます。実際に発生しない限り、エラーではありません。

コンパイル時エラーはE_PARSE、 PHP では 、 E_COMPILE_ERROR、またはE_COMPILE_WARNING(致命的ではない) です。これには、ファイル、関数、またはクラスが見つからない、つまりそこにないコードを実行しようとする、PHP では不可能なことが含まれます。PHP でできる場合、試してみます。

検出と防止

少なくとも、開発環境とテスト環境のすべての PHP エラー ジャンクが ini でオンになっていることを確認する必要があります。

error_reporting = E_ALL|E_STRICT
display_errors = On

または実行時に:

error_reporting(-1);

自己規律

PHP を使用するためのいくつかのヒントが役立ちます。

  • 関数型プログラミングを使用する
  • コードの匂いを確立し、きれいな構文を書く
  • 独自の型チェックを行う (OOP と関数型プログラミングにより、これが容易になります)
  • グローバル スコープとinclude()ベースの制御構造を避ける
  • Netbeansなどのコード認識支援機能を備えた IDE を使用します。

たとえば、上記の例では、変数を使用する前にパラメーターをチェックする関数またはメソッドに変数を渡す必要がある場合isset()!== null初期化されていない変数の問題を回避または軽減できます。

資力

于 2010-07-26T01:59:07.287 に答える
4

error_reporting 構成ディレクティブを適切に設定すると、PHP は警告または通知のいずれかで間違いなく文句を言います。

見る:

http://us2.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

于 2010-07-25T21:39:28.430 に答える
0
  1. Hackは Facebook によって作成された静的型付け言語であり、基本的に PHP に多くの機能が追加および削除されています。
  2. PhpStormは、例の未定義変数など、静的型チェッカーによってキャッチされる多くのものをキャッチする「インスペクション」を提供する IDE です。
  3. ここでは、PHP7 の型ヒントと PHPDoc 注釈に基づいて、PHP 用の静的型チェッカーを書き始めました。私はそれを完成させたことはありませんが、いくつかの合格したテストがあり、これまでの設計は健全であるようです.
于 2016-03-27T12:01:56.457 に答える
0

これは、PHP コード分析ツールに焦点を当てた別のSO の質問です。

于 2010-07-27T18:01:31.193 に答える
0

最も近いのは php の lint チェッカーですが、これは構文チェッカーに近いものです。コマンドラインから lint を実行できます。

php -l path/to/file.php

コミット前チェックを設定することで、これをファイル リポジトリ システムに組み込むことができます。

于 2010-07-25T22:47:17.890 に答える
0

PHP は通常、別個の COMPILE プロセスを経るとは見なされないため、コードが COMPILED であると見なされる時点を説明していただけますか?

于 2010-07-26T03:06:16.547 に答える
0

エラーレポートを最大に設定すると、そのタイプのエラーがキャッチされます。$vr1 が設定されていないことを示す通知が表示されます。

php.ini ファイル、または ini_set() 関数を使用して個々のページでエラー報告を設定できます。

于 2010-07-25T21:39:44.250 に答える