$array = array();
だから..次のような変数を使用して配列を作成し、手動で変数を設定するとき、私はまだこれに混乱しています:
<?php
$array[] = 1;
$array['type'] = 2;
$array['number'] = 3;
PHP でこれを実行しても問題ないことはわかっていますが、次のような$array['none']
ことをエコーすると、未定義の変数に対して E_NOTICE が表示されません。
誰かが私を説明できますか、なぜですか?
そうなる。エラー レポートを有効にしている場合は、次のような警告が表示されます。
Notice: Undefined index: none in /path/to/script.php 行 X.
確認するには、次のことを試してください。
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$array = array();
echo $array['none'];
また、コードで使用する前にそれらが存在することを実際に確認したい場合は、次を使用しますisset()
。
if(isset($array['none'])) {
// do stuff ...
}
これはすべて構成ドキュメントページでも説明されています。
開発中に E_NOTICE を有効にすると、いくつかの利点があります。
デバッグ目的: NOTICE メッセージは、コード内の潜在的なバグについて警告します。たとえば、割り当てられていない値の使用は警告されます。タイプミスを見つけたり、デバッグの時間を節約したりするのに非常に役立ちます。
NOTICE メッセージは、不適切なスタイルについて警告します。たとえば、$arr[item] は $arr['item'] と記述した方が適切です。PHP は「item」を定数として処理しようとするからです。定数でない場合、PHP はそれが配列の文字列インデックスであると想定します。
非常に簡単です。存在しないキーにアクセスして新しい値を割り当てると、PHP はそのキーを作成し、リスト (または配列) に追加します。しかし、存在しないキーにアクセスしてその値をエコーしようとすると、PHP はクラッシュしませんが、コードに潜在的なバグが含まれていることがわかります。
$arr = array('foo' => 'bar');
echo $arr['fo'];
コードにタイプミスが含まれている可能性があるため、これにより通知が発行されます。キーfo
が存在することを期待するかもしれませんが、明らかに存在しないため、コードにもう少し取り組む必要があります。
この通知が発行されるもう 1 つの理由は、存在しないプロパティ/キーの検索が「遅い」ためです。キーが存在しないという事実をPHP が認識するためには、配列全体をスキャンする必要があります。それも理想的ではありませんが、避けられない場合もあります。大量の を発行するコードがある場合、次のようE_NOTICE
な単純な がいくつかある可能性があります。if
if (!isset($arr['fo']))
{
$arr['fo'] = '';
}
echo $arr['fo'];
コードを追加しても、コードを効果的に高速化できます。通知の発行は無料ではないため、少なくともそうではありません (それほど高価ではありませんが、無料でもありません)。
他の利点:
通知は、配列キーを引用するのを忘れたときにも知らせます。たとえば、
echo $arr[foo];
echo $arr['foo'];
最初はどちらも echobar
になりますが、これに 1 行のコードを追加しましょう。
define('foo', 'bar');
echo $arr[foo];
echo $arr['foo'];
foo
は現在定数であるため、$arr[foo]
未定義$arr['bar'];
のインデックスである になります。通知をオフにすると、空の文字列である NULL の文字列表現がエコーされます。
基本的に、通知はあなたを助けます。それらを使用し、それらに耳を傾け、それらを修正します。サイトが壊れている場合は、修正してください。これらの通知を無視する習慣に陥ると、おそらく ini ファイルをより「寛容な」設定に設定し、怠惰になるでしょう。
時間が経つにつれて、コードはますますごちゃごちゃ/臭いものになり、実際にバグを追跡するのが困難になるまで. エラー報告をE_STRICT | E_ALL
に変更すると、バグが実際にどこにあるかを示す実際の通知/警告が表示されなくなりますE_NOTICE undefined index/variable
。