Php 错误抑制@不工作

Php 错误抑制@不工作,php,error-suppression,Php,Error Suppression,我很高兴在我的PHP开发设置中使用了错误抑制操作符。但最近却收到了这样的通知: 注意:第35行C:\websites\xxx\htdocs\includes\myscript.php中的未初始化字符串偏移量:0 第35行: $file_name=@$file['file_name']; 我已打开显示错误,错误报告设置为6143(E_ALL) 我错过什么了吗?错误不应该被抑制吗 编辑: 在virgin脚本中测试: $a = array(); $b = @$a['f5']; $a=数组(); $b=

我很高兴在我的PHP开发设置中使用了错误抑制操作符。但最近却收到了这样的通知:

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

$file_name=@$file['file_name']; 我已打开显示错误,错误报告设置为6143(E_ALL)

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

编辑:

在virgin脚本中测试:

$a = array(); $b = @$a['f5']; $a=数组(); $b=@$a['f5']; 抑制错误。所以我认为我们正在以某种方式改变错误报告值。(11点拍摄)


Thx用于yr帮助。

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

由于错误涉及字符串偏移量0,因此它不能应用于提供的代码行。没有整数偏移;您正在使用字符串“file\u name”

此外,使用@是一个非常糟糕的主意。函数可能会失败,导致脚本在退出时完全没有显示位置或原因。处理粘贴的代码行的更好方法是:

if (isset($File['file_name'])) {
  $file_name = $File['file_name'];
} else {
  // throw exception, return FALSE, print an error and exit, whatever
}

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

$a = 0; $b = $a['f5'];
$s= 'abcd';
print_r($s[1]);
$a=0; $b=$a['f5']; 不会生成错误

鉴于:

$a = ''; $b = $a['f5']; $a=''; $b=$a['f5']; 生成此错误:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 注意:第3行C:\websites\tcv3\wc2009\htdocs\aatest\u array.php中的未初始化字符串偏移量:0 这就是我遇到的问题。如果我将其切换到使用array()初始化$a,则错误抑制会起作用。此外,在没有误差抑制的情况下,它给出了误差中的适当指标

我怀疑这是PHP5.2.2中的一个bug。有人能在更新的版本中测试这个吗


谢谢你们的帮助。

这里不太喜欢错误抑制,除了那些没有好方法捕捉错误的一次性脚本或实例

让我解释一下
未初始化字符串偏移量
错误的行为。这不是一个bug:

示例#1

$a = 0;
$b = $a['f5'];
$a
是一个数值标量值。在第二行中,PHP隐式地将这个数值转换为字符串。字符串
'0'
的长度为1

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

$a = 0; $b = $a['f5'];
$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

这些都是松散类型语言编程的难点

就好像你在隐瞒错误的陈述。请提供代码显示所有代码,可以在任何一行。对不起,塞萨尔,脚本太大。但到目前为止,我一直试图复制,但没有成功。(见上面的编辑)德里克,这本手册不适合你:我通常会使用($isset($File['File\u name'])?$File['File\u name']:'')。但在索引问题上,我不同意你的观点:这似乎是我正在使用的PHP版本(5.2.2)中的一个bug。看到我给出的答案了吗?奇怪。谢谢你的提醒。当你说“PHP中的一个bug”。。。你说的是第一段代码没有生成错误,对吗?从其他代码中得到的错误是完全有效的。