作为开发人员,我开启了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你认为不是错误的所有错误,你可能会变得自满,并开始忽略这些消息,然后有一天当真正的错误发生时,你就不会注意到它.
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)
如果你没有"修复"前一种情况,那么变量可能合法地不存在,你就不能有意义地使用通知来捕捉第二种情况中的拼写错误.
通知可以帮助您调试您的应用程序.如果你忽视它们,那你只会让自己的生活变得更加困难.