なんでこんなことが起こっているの?
時間の経過とともに、PHPはよりセキュリティ重視の言語になりました。以前はデフォルトでオフになっていた設定が、デフォルトでオンになりました。これの完璧な例はです。これはE_STRICT
、PHP 5.4.0以降、デフォルトでオンになりました。。
さらに、PHPのドキュメントによれば、デフォルトでE_NOTICE
はphp.iniで無効になっています。PHPのドキュメントでは、デバッグのために有効にすることをお勧めしています。しかし、Ubuntuリポジトリから、そしてBitNamiのWindowsスタックからPHPをダウンロードすると、別のものが表示されます。
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting
はデフォルトでは「デフォルト」値ではなく、実際には本番値に設定されていることに注意してください。これはやや混乱を招き、php.ini以外ではドキュメント化されていないため、他のディストリビューションでは検証していません。
しかし、あなたの質問に答えるために、このエラーは以前にポップアップしなかったときにポップアップします:
PHPをインストールしましたが、新しいデフォルト設定はいくぶん文書化されていませんが、除外していませんE_NOTICE
。
E_NOTICE
未定義の変数や未定義のインデックスなどの警告は、実際にコードをよりクリーンで安全にするのに役立ちます。何年も前に、E_NOTICE
有効にしておくと変数を宣言しなければならなくなったことがわかります。Cを学ぶのがとても簡単になりました。変数を宣言しないと厄介なことになります。
私はそれについて何ができますか?
E_NOTICE
「デフォルト値」E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
をコピーして、等号の後にコメント解除されているものに置き換えてオフにしerror_reporting =
ます。Apache、またはCGIまたはFPMを使用している場合はPHPを再起動します。「正しい」php.iniを編集していることを確認してください。正しい方法は、ApacheでPHPを実行している場合はApache、PHP-FPMを実行している場合はfpmまたはphp-fpm、PHP-CGIを実行している場合はcgiなどです。これは推奨される方法ではありませんが、編集が非常に難しい場合は、それが最善の策かもしれません。
E_NOTICE
ファイルまたはフォルダレベルでオフにします。これは、レガシーコードがいくつかあるが、それ以外の場合は「正しい」方法で実行したい場合に適しています。これを行うには、Apache2、Nginx、または選択したサーバーが何であるかを調べてください。Apacheでは、のphp_value
内部で使用します<Directory>
。
よりクリーンになるようにコードを書き直してください。本番環境に移動させながら、これを実行する必要があるか、誰かがあなたのエラーを表示したくない場合は、必ずエラーのいずれかの表示を無効にしている、とだけ作るのロギング(参照あなたのエラーをdisplay_errors
し、log_errors
php.iniの中で、サーバーの設定) 。
オプション3を拡張するには、これが理想的です。このルートに行けるなら、そうすべきです。最初にこのルートを使用しない場合は、開発環境でコードをテストして、最終的にこのルートを移動することを検討してください。あなたがそれにいる間、取り除く~E_STRICT
と~E_DEPRECATED
将来的にはうまくいかないかもしれないかを確認します。見慣れないエラーがたくさん表示されますが、将来的にPHPをアップグレードする必要があるときに不愉快な問題が発生するのを防ぐことができます。
エラーはどういう意味ですか?
Undefined variable: my_variable_name
-これは、使用前に変数が定義されていない場合に発生します。PHPスクリプトが実行されると、内部的にはnull値と見なされます。ただし、どのシナリオで、変数が定義される前に変数をチェックする必要がありますか?結局、これは「ずさんなコード」の議論です。開発者として、変数が定義可能な範囲で上位に定義されているオープンソースプロジェクトを見ると、私はそれが好きだと言えるでしょう。これにより、将来どの変数がポップアップするかがわかりやすくなり、コードの読み取り/学習が容易になります。
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
-これは、配列内の値にアクセスしようとしたときに存在しない場合に発生します。このエラーを回避するには、条件チェックを実行します。
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
別のオプションは、関数の上部で空の配列を宣言することです。これは常に可能であるとは限りません。
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(追加のヒント)
- これらの問題やその他の問題に遭遇したとき、私はNetBeans IDE(無料)を使用し、多くの警告と通知を受け取りました。それらのいくつかは非常に役立つヒントを提供します。これは必須ではなく、大規模なプロジェクト以外ではIDEを使用しません。私は
vim
最近、もっと人になりました:)。