错误抑制@不工作

时间:2009-11-25 19:33:03

标签: php error-suppression

我很高兴在PHP开发设置中使用错误抑制运算符。但是最近已经受到了类似的通知:

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

第35行:

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

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

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

编辑:

在处女脚本中测试:

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

压制错误。所以我想我们正在以某种方式改变error_reporting值。 (11日电影)

谢谢你的帮助。

4 个答案:

答案 0 :(得分: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是零长度字符串。第二行与$b= $a[0];相同 - 即,第二行是要求零长度字符串的第一个字符,但该字符串不包含任何字符。因此PHP抛出以下错误,让您知道索引根本不存在:

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

这些是松散类型语言编程的难题。

答案 1 :(得分: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
}

答案 2 :(得分:0)

好的,这就是:PHP不能很好地处理非阵列变量的下标。例如:

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

不会产生错误。

鉴于:

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

生成此错误:

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

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

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

谢谢你的帮助。

答案 3 :(得分:-3)

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