我为什么要修复E_NOTICE错误?利弊

时间:2012-04-09 17:31:54

标签: php

我应该在实时服务器上启用E_NOTICE吗?

正如我在Why should I fix E_NOTICE errors?中看到的那样 每个人都再次使用isset()来省略通知。我已阅读专业人士,但代码可读性如何?

让我们来看看一些代码:

if ($this->_oldattributes['category_id'] != $tattr['category_id']
    || $this->_oldattributes['deal_id'] != $tattr['deal_id']
) {

清楚明白我想要什么,对吧?

允许添加isset()以省略通知:

$old_cat_id = isset($this->_oldattributes['category_id']) ? $this->_oldattributes['category_id'] : null;
$new_cat_id = isset($tattr['category_id']) ? $tattr['category_id'] : null;
$old_deal_id = isset($this->_oldattributes['deal_id']) ? $this->_oldattributes['deal_id'] : null;
$new_deal_id = isset($tattr['deal_id']) ? $tattr['deal_id'] : null;
if ($old_cat_id != $new_cat_id || $old_deal_id != $new_deal_id) {

不错,但现在我需要更多时间来了解这里发生的事情。

关于调试的几点 - 我从来没有浪费一天来调试由未初始化的变量引起的错误。是的,也许半个小时被浪费下来进入课程/功能,但与丢失代码可读性恕我直言相比,这不是一个很大的浪费?

关于绩效的几点 - http://seanmonstar.com/post/909029460/php-error-suppression-performance

  

不同之处在于只要检查通知是否存在,抑制通知就会花费100%“   测试是在1000000次压力下进行的。即使你使用Zend + Doctrine +其他东西,你的代码中会出现多少个?与DB连接等相比需要多少时间?

也许我只是不习惯编写正确的代码(现在只使用PHP很长时间)。

对于上下文,我们将项目移动到显示E_NOTICEs的服务器,这就是我问这个问题的原因。我不知道为什么这是关闭它们的大问题?

另一个例子:

class Item extends CActiveRecord {
    private $_oldattributes = array();

public function afterFind()
{
    // Save old values
    $this->_oldattributes = $this->getAttributes();
    $this->_oldcategory = $this->category;
    $this->_olddeal = $this->deal;
}

所以如果旧属性不存在,我将为null 和

$tattr = $this->getAttributes();
$this->_oldattributes['category_id'] != $tattr['category_id']

这将给我我需要的东西,并且没有错误,对吧?

与非对象错误相同,在Yii中,当我设置关系时,某些对象可能无法初始化,是的,有一种错误,因为在这种情况下有空值而未初始化有时是真正的错误:

$this->deal->item->id != $this->_olddeal->item->id

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

if ($_GET['foo']) ...

问题在于我不能忽视这一点,因为它仍然会引起注意 每当我使用它时,我必须写:

if (isset($_GET['foo']) && $_GET['foo']) ...

或:

if (@$_GET['foo']) ...

2 个答案:

答案 0 :(得分:3)

当我查看您的代码时,例如

$this->_oldattributes['category_id']

我的第一个想法是,这可能应该是一个班级。

class Attributes {
  public $categoryId;
  // and so on
}

现在的区别是,不再需要使用isset(),因为现在属性存在(可能是null)或者它是一个bug(“未定义的属性”)并且应该固定。我认为你用isset()“修复”的大多数情况属于这种情况。

答案 1 :(得分:1)

调试代码时,如果未定义应定义的变量,则可以使用未定义的变量消息。 我认为在使用之前定义变量是一个好习惯,据我所知,其他语言比PHP更严格。