【问题标题】:Error Suppression @ Not Working错误抑制@不工作
【发布时间】:2009-11-25 19:33:02
【问题描述】:

我一直很乐意在我的 PHP 开发设置中使用错误抑制运算符。但最近收到了这样的通知:

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

第 35 行:

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

我已打开 display_errors,并且 error_reporting 设置为 6143 (E_ALL)。

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

编辑:

在原始脚本中测试:

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

抑制了错误。所以我认为我们正在以某种方式更改 error_reporting 值。 (电影 11 点)

谢谢你的帮助。

【问题讨论】:

  • 这就像你在压制错误的陈述。请提供代码
  • 显示所有代码,可以在任何一行。
  • 抱歉,Cesar,脚本太大。但到目前为止,我试图复制但没有成功。 (见上面的编辑)

标签: php error-suppression


【解决方案1】:

这里不是错误抑制的忠实拥护者,除非是一次性脚本或确实没有捕捉错误的好方法的实例。

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

这些是使用松散类型语言进行编程时遇到的困难。

【讨论】:

    【解决方案2】:

    由于错误涉及的字符串偏移量为 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)中的一个错误。请参阅我提出的答案。
    • 奇怪。感谢您的提醒。
    【解决方案3】:

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

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

    不会产生错误。

    鉴于:

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

    产生这个错误:

    注意:未初始化的字符串偏移量:第 3 行 C:\websites\tcv3\wc2009\htdocs\aatest_array.php 中的 0

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

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

    谢谢你们的帮助。

    【讨论】:

    • 当您说“PHP 中的一个错误”时……您是在说第一段代码没有产生错误,对吧?您从其他代码中得到的错误是完全有效的。
    【解决方案4】:

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

    【讨论】:

    猜你喜欢
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多