5

我一直很乐意在我的 PHP 开发设置中使用错误抑制运算符。但最近收到了这样的通知:

注意:未初始化的字符串偏移量:第 35 行 C:\websites\xxx\htdocs\includes\myscript.php 中的 0

第 35 行:

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

我打开了 display_errors,并且 error_reporting 设置为 6143 (E_ALL)。

我错过了什么吗?不应该抑制错误吗?

编辑:

用原始脚本测试:

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

抑制了错误。所以我认为我们正在以某种方式更改 error_reporting 值。(电影 11 点)

谢谢你的帮助。

4

4 回答 4

4

这里不是错误抑制的忠实拥护者,除非是丢弃的脚本或确实没有很好的方法来捕获错误的实例。

让我解释一下Uninitialized string offset错误的行为。这不是一个错误:

示例 #1

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

$a是数值标量值。在第二行中,PHP 隐式将此数值转换为字符串。该字符串'0'的长度为 1。

在 PHP 中,您可以使用数组索引在字符串中查找字符,因为 PHP 在内部将字符串存储为数组。例如:

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

此代码的输出将是b字符串中的第二个字符。在示例 #1 中,查找'f5'被转换为数字,因为字符串只能按字符位置索引。echo intval('f5');向我们展示了 PHP在数字上下文中将'f5'字符串解释为什么。0

跟我到现在?当我们将其应用于示例 #2 时会发生以下情况

示例 #2

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

$a is zero-length string. The second line is the same as $b= $a[0]; - i.e., the second line is asking for the first character of a zero-length string, but the string contains no characters. So PHP throws the following error, letting you know the index simply does not exist:

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

These are the hard knocks of programming in a loosely typed language.

于 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

好的,事情是这样的:PHP 不能很好地处理非数组变量的下标。例如:

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

不会产生错误。

然而:

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

生成此错误:

注意:未初始化的字符串偏移量:第 3 行 C:\websites\tcv3\wc2009\htdocs\aatest_array.php 中的 0

这就是我遇到的问题。如果我将其切换为使用 array() 初始化 $a,则错误抑制会起作用。此外,如果没有错误抑制,它会在错误中给出正确的索引。

我怀疑这是 PHP 5.2.2 中的一个错误。有人可以在更新的版本中对此进行测试吗?

谢谢你们的帮助。

于 2009-11-25T20:53:37.397 回答
-3

不,@抑制器避免显示来自函数调用的警告,而不是变量访问和声明。Notice告诉您您正在访问一个未定义的字符串元素,[0]因此未初始化。如果你想抑制这些,尝试检查所有未初始化的变量并根据它们给它们一个值,就像你可以用 C 做的那样。

于 2009-11-25T19:40:51.713 回答