我为什么要修复E_NOTICE错误?

Ben*_*nee 31 php

作为开发人员,我开启了E_NOTICE.最近,我被问到为什么应该修复E_NOTICE错误.我能想出的唯一理由是纠正这些问题是最佳做法.

是否有其他人有理由证明为纠正这些问题花费的额外时间/成本是合理的?

更具体地说,如果代码已经运行,为什么经理要花钱来修复这些?

Mik*_*kel 30

摘要

PHP运行时配置文件给你一些想法,为什么:

在开发期间启用E_NOTICE有一些好处.

出于调试目的:NOTICE消息将警告您代码中可能存在的错误.例如,警告使用未分配的值.找到拼写错误并节省调试时间非常有用.

注意消息将警告您不良风格.例如,$ arr [item]最好写成$ arr ['item'],因为PHP试图将"item"视为常量.如果它不是常量,PHP假定它是数组的字符串索引.

这里有一个更详细的解释...


1.检测TYPOS

E_NOTICE错误的主要原因是错别字.

示例 - notice.php

<?php
$username = 'joe';        // in real life this would be from $_SESSION

// and then much further down in the code...

if ($usernmae) {            // typo, $usernmae expands to null
    echo "Logged in";
}
else {
    echo "Please log in...";
}
?>
Run Code Online (Sandbox Code Playgroud)

没有E_NOTICE的输出

Please log in...
Run Code Online (Sandbox Code Playgroud)

错误!你不是那个意思!

使用E_NOTICE输出

Notice: Undefined variable: usernmae in /home/user/notice.php on line 3
Please log in...
Run Code Online (Sandbox Code Playgroud)

在PHP中,不存在的变量将返回null而不是导致错误,这可能导致代码的行为与预期不同,因此最好注意E_NOTICE警告.


2.检测AMBIGUOUS ARRAY指数

它还会警告您可能会改变的数组索引,例如

示例 - 代码今天看起来像这样

<?php

$arr = array();
$arr['username'] = 'fred';

// then further down

echo $arr[username];
?>
Run Code Online (Sandbox Code Playgroud)

没有E_NOTICE的输出

fred
Run Code Online (Sandbox Code Playgroud)

示例 - 明天您将包含一个库

<?php
// tomorrow someone adds this
include_once('somelib.php');

$arr = array();
$arr['username'] = 'fred';

// then further down

echo $arr[username];
?>
Run Code Online (Sandbox Code Playgroud)

和库做这样的事情:

<?php
define("username", "Mary");
?>
Run Code Online (Sandbox Code Playgroud)

新产出

空,因为现在它扩展为:

echo $arr["Mary"];
Run Code Online (Sandbox Code Playgroud)

并没有关键Mary$arr.

使用E_NOTICE输出

如果只有程序员E_NOTICE打开,PHP会打印一条错误消息:

Notice: Use of undefined constant username - assumed 'username' in /home/user/example2.php on line 8
fred
Run Code Online (Sandbox Code Playgroud)

3.最好的理由

如果你没有修复E_NOTICE你认为不是错误的所有错误,你可能会变得自满,并开始忽略这些消息,然后有一天当真正的错误发生时,你就不会注意到它.

  • 这个答案清楚地解释了许多开发人员不理解的内容:通知是一种*工具*,就像 HTML 验证器、源代码控制或单元测试(或一般的错误消息)一样。 (2认同)

dec*_*eze 16

因为a E_NOTICE表示错误.
PHP太过于宽容而无法称之为.

例如,访问未定义的变量会产生一个E_NOTICE.
如果经常发生这种情况,例如因为你没有正确地初始化你的变量,并且你的应用程序正在向所有地方发出通知,那么你将如何区分"无法正常运行的变量"和你的时间之间的区别有一个变量名称真的胖吗?

这可能触发通知但会按预期工作,因此您忽略通知:

if ($_GET['foo']) ...
Run Code Online (Sandbox Code Playgroud)

另一方面,这会浪费你一半的时间,而你忽略了通知,并试图弄清楚为什么你的" bar()功能不起作用":

$foo = bar();
if ($too) ...
Run Code Online (Sandbox Code Playgroud)

如果你没有"修复"前一种情况,那么变量可能合法地不存在,你就不能有意义地使用通知来捕捉第二种情况中的拼写错误.

通知可以帮助您调试您的应用程序.如果你忽视它们,那你只会让自己的生活变得更加困难.