我很高兴在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日电影)
谢谢你的帮助。
答案 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一样。