2009-11-25 127 views
5

我一直都很乐意在我的PHP开发环境中使用错误抑制操作符。但最近已经得到击中像这样声明:错误抑制@无法正常工作

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

线35:

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

我有display_errors设置,并使用error_reporting设置为6143(E_ALL)。

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

编辑:

在处女脚本测试:

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

抑制误差。所以我认为我们以某种方式改变了error_reporting的值。 (电影在11)

Thx for yr help。

+1

你能张贴第35行吗? – 2009-11-25 19:34:55

+0

这就像你压制错误的陈述。请提供代码 – 2009-11-25 19:41:40

+0

显示所有代码,可以在任意行。 – Cesar 2009-11-25 19:55:08

回答

5

这里除了丢弃脚本或实例没有很好的方法来捕捉错误之外,并不是一个很大的错误抑制迷。

让我来解释一下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 

这些都是规划在一个松散类型的语言艰苦的磨练。

+0

Thx为清晰和简洁的解释,pygorex1。 – NotoriousWebmaster 2009-11-27 20:34:18

-3

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

+2

本手册不同意你的看法,Derek: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster 2009-11-25 19:51:55

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 
} 
+0

我通常会用($ isset($ File [' file_name'])?$ File ['file_name']:'')。但在索引问题上,我不得不不同意这个观点:它似乎是我使用的PHP版本(5.2.2)中的一个错误。看到我放下的答案。 – NotoriousWebmaster 2009-11-25 21:15:12

+0

奇怪。感谢您的提醒。 – 2009-11-25 21:57:07

0

OK,这里的东西: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中的一个错误。有人可以在更新的版本中测试它吗?

Thx为您的帮助球员。

+0

当你说“PHP中的一个bug”时......你谈论的第一个代码不会产生错误,对吧?从其他代码中得到的错误是完全有效的。 – DisgruntledGoat 2009-11-25 21:24:02

相关问题