5

私はPHP開発セットアップでエラー抑制演算子をうまく使用しています。しかし、最近、次のような通知が表示されます。

注意:初期化されていない文字列オフセット:35行目のC:\ website \ xxx \ htdocs \ contains\myscript.phpで0

35行目:

$ file_name = @ $ File ['file_name'];

display_errorsをオンにし、error_reportingを6143(E_ALL)に設定しています。

私は何かが足りないのですか?エラーを抑制すべきではありませんか?

編集:

バージンスクリプトでテスト済み:

$ a = array();
$ b = @ $ a ['f5'];

エラーを抑制しました。したがって、error_reporting値を何らかの方法で変更していると思います。(11時のフィルム)

年の助けのためのThx。

4

4 に答える 4

4

エラーをキャッチする良い方法がないスローアウェイ スクリプトやインスタンスを除いて、ここではエラー抑制の大ファンではありません。

エラーの挙動について説明しUninitialized string offsetます。これはバグではありません:

例 #1

$a = 0;
$b = $a['f5'];

$a数値スカラー値です。2 行目で、PHP はこの数値を文字列に暗黙的にキャストしています。文字列'0'の長さは 1 です。

PHP では、配列インデックスを使用して文字列内の文字を検索できます。これは、PHP が内部的に文字列を配列として格納するためです。例えば:

$s= 'abcd';
print_r($s[1]);

このコードの出力はb、文字列の 2 番目の文字のようになります。例 #1 では、'f5'文字列は文字位置によってのみインデックス付けできるため、ルックアップは数値に変換されています。PHP が文字列を数値コンテキストとしてecho intval('f5');解釈する内容を示します。'f5'0

ここまで私と?これを例 2 に適用すると、次のようになります。

例 #2

$a = '';
$b = $a['f5'];

$a長さゼロの文字列です。2 行目は と同じです。$b= $a[0];つまり、2 行目は長さ 0 の文字列の最初の文字を要求していますが、文字列には文字が含まれていません。そのため、PHP は次のエラーをスローし、インデックスが存在しないことを知らせます。

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3

これらは、緩く型付けされた言語でのプログラミングのハード ノックです。

于 2009-11-26T01:18:50.100 に答える
1

エラーには 0 の文字列オフセットが含まれているため、提供されたコード行には適用されません。整数オフ​​セットはありません。そこで文字列「file_name」を使用しています。

また、「@」を使用するのは本当にひどい考えです。関数が失敗する可能性があり、その結果、スクリプトが終了し、その場所や理由がまったく示されません。貼り付けたコード行を処理するより良い方法は次のとおりです。

if (isset($File['file_name'])) {
  $file_name = $File['file_name'];
} else {
  // throw exception, return FALSE, print an error and exit, whatever
}
于 2009-11-25T20:31:42.610 に答える
0

OK、ここに問題があります: PHP は非配列変数への添え字をうまく処理しません。例えば:

$a = 0;
$b = $a['f5'];

エラーを生成しません。

一方:

$a = '';
$b = $a['f5'];

次のエラーが生成されます。

Notice: C:\websites\tcv3\wc2009\htdocs\aatest_array.php の 3 行目の初期化されていない文字列オフセット: 0

そして、それが私が抱えていた問題です。$a を array() で初期化するように切り替えると、エラー抑制が機能します。さらに、エラー抑制なしでは、エラーに適切なインデックスが与えられます。

これは PHP 5.2.2 のバグだと思います。誰かがこれを最新バージョンでテストできますか?

助けてくれてありがとう。

于 2009-11-25T20:53:37.397 に答える
-3

いいえ、@サプレッサーは、変数へのアクセスや宣言ではなく、関数呼び出しからの警告の表示を回避します。は、定義されていないため初期化されていないNotice文字列要素にアクセスしていることを示しています。[0]これらを抑制したい場合は、初期化されていない変数をすべてチェックし、C で行う場合と同様に、それに応じた値を指定してください。

于 2009-11-25T19:40:51.713 に答える