web-dev-qa-db-ja.com

PHPの厳格モード?

Perlなどの自動変数宣言を使用する他の言語には、厳密モードがあります。

この厳格モードを有効にすると、変数宣言が必要になり、宣言されていない変数を使用しようとするとすぐにPerlがエラーをスローします。

PHPは同様の機能を提供しますか?

61
jantimon

やや。 エラー報告E_NOTICEレベルを有効にできます。 (定数のリスト ここ 。)

宣言されていない変数の使用のすべてのインスタンスは、E_NOTICEをスローします。

E_STRICTエラーレベルは、これらの通知と、コードを最適化する方法に関する他のヒントもスローします。

error_reporting(E_STRICT);

スクリプトの終了

本当に深刻で、宣言されていない変数に遭遇したときに単に通知を出力するのではなく、スクリプトにterminateさせたい場合は、 カスタムエラーハンドラ を構築できます。

「未定義変数」が含まれるE_NOTICEsのみを処理し、他のすべてをデフォルトのPHPエラーハンドラーに渡します。

<?php

error_reporting(E_STRICT);

function terminate_missing_variables($errno, $errstr, $errfile, $errline)
{                               
  if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable")))
   die ("$errstr in $errfile line $errline");

  return false; // Let the PHP error handler handle all the rest  
}

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error

xxxx();  // Will throw standard PHP error

 ?>
65
Pekka 웃

つかいます

error_reporting(-1);

E_STRICTを含むすべての可能なエラーを表示し、新しいレベルと定数が将来追加される場合でもPHPバージョン。

参照

39
Gordon

数年後、php 7.0.0はdeclare(strict_types=1);を獲得しました

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict

5
Full

はい、スクリプトの先頭にerror_reporting(E_STRICT|E_ALL);と入力します。

3
chelmertz

error_reporting 、設定することを忘れないでください display_errors も同様です。エラー報告には複数のレベルがあることに注意してください。

2
gblazex

PHPisデフォルトでは未宣言の変数に関する警告です。 error reporting レベルを上げるだけで、通知。ただし、PHPで変数を宣言するための特別な構文はなく、割り当てて変数を宣言するだけなので、未宣言の変数の値を使用します。他の言語とは異なり、「未宣言の変数への割り当て」は存在しないため、PHPは警告できません。

1
deceze

つかいます

error_reporting(E_ALL);

PHPコード。または、php.iniファイルでerror_reporting設定を設定して、すべてのPHPファイルに設定する

1
JochenJung

set_error_handler() を使用して、独自のエラー処理関数を実装できます。

その後、必要に応じて特定のエラーレベルに対応できます。

たとえば、エラーメッセージを表示して記録するだけでなく、変数が適切に宣言されていない場合や、気に入らない条件が満たされている場合は、スクリプトを終了できます。

そうすれば、PHPインタープリターインスタンスで実行されるコードに対して非常に厳しいポリシーを適用できます。

1
selfawaresoup

エラーの報告と処理の要件は、開発環境と運用環境(WWW、企業イントラネットなど)で異なることをお勧めします。開発中は、問題を見つけて修正するために、可能な限り詳細を確認する必要があります。

ライブ環境では、PHPエラーメッセージをユーザーに表示するのではなく、スクリプトの機能を減らして続行できるようにする必要はありません(たとえば、「申し訳ありませんが、または、ユーザーをホームページにリダイレクトするなど)。これを実現する方法は、各環境のカスタムエラーハンドラーを使用することです。

0
Vincent

はい、エラー報告でそれを行います。

http://www.php.net/manual/en/function.error-reporting.php

0
Palantir