错误抑制@无法正常工作
我一直都很乐意在我的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。
这里除了丢弃脚本或实例没有很好的方法来捕捉错误之外,并不是一个很大的错误抑制迷。
让我来解释一下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
这些都是规划在一个松散类型的语言艰苦的磨练。
Thx为清晰和简洁的解释,pygorex1。 – NotoriousWebmaster 2009-11-27 20:34:18
不,@
抑制器避免显示来自函数调用的警告,而不是显示变量访问和声明的警告。 Notice
告诉您,您正在访问未定义的字符串元素[0]
,因此未初始化。如果您想要抑制这些变量,请尝试检查所有未初始化的变量,并根据您的要求给它们一个值。
本手册不同意你的看法,Derek: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster 2009-11-25 19:51:55
由于错误涉及到字符串偏移量0,因此它不能应用于行提供的代码。没有整数偏移量;你在那里使用字符串'file_name'。
另外,使用'@'是一个非常可怕的想法。函数可能会失败,从而导致脚本退出,并且完全没有指示何处或原因。一个更好的办法来处理你粘贴代码行是这样的:
if (isset($File['file_name'])) {
$file_name = $File['file_name'];
} else {
// throw exception, return FALSE, print an error and exit, whatever
}
我通常会用($ isset($ File [' file_name'])?$ File ['file_name']:'')。但在索引问题上,我不得不不同意这个观点:它似乎是我使用的PHP版本(5.2.2)中的一个错误。看到我放下的答案。 – NotoriousWebmaster 2009-11-25 21:15:12
奇怪。感谢您的提醒。 – 2009-11-25 21:57:07
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为您的帮助球员。
当你说“PHP中的一个bug”时......你谈论的第一个代码不会产生错误,对吧?从其他代码中得到的错误是完全有效的。 – DisgruntledGoat 2009-11-25 21:24:02
你能张贴第35行吗? – 2009-11-25 19:34:55
这就像你压制错误的陈述。请提供代码 – 2009-11-25 19:41:40
显示所有代码,可以在任意行。 – Cesar 2009-11-25 19:55:08