2

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

正如我在为什么要修复 E_NOTICE 错误中看到的那样? 每个人都再次使用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+其他东西?还有多少与数据库连接等相比需要时间吗?

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

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

另一个例子:

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']) ...
4

2 回答 2

3

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

$this->_oldattributes['category_id']

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

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

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

于 2012-04-09T17:44:46.937 回答
1

在调试代码时,如果未定义应定义的变量,则最好有未定义的变量消息。我认为在使用之前定义变量是一种很好的做法,据我所知,其他语言在这方面比 PHP 更严格。

于 2013-12-21T21:47:50.367 回答