2012-04-09 78 views
2

我應該在實時服務器上啓用E_NOTICE嗎?我爲什麼要修復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%,只要剛剛檢查,如果它首先存在」 測試在百萬supressions執行出現他們中有多少在你的代碼中,即使你使用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; 
} 

,所以我會爲空,如果舊的屬性不存在 和:

$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']) ... 
+0

是的,這是已經發生,我需要現在修復我所有的通知:)但我不明白爲什麼我不能關閉它? – llamerr 2012-04-09 17:36:48

+0

對編輯正確的意見 – llamerr 2012-04-09 17:37:09

+4

你應該修復E_NOTICE *錯誤*如果他們實際上是錯誤。 (例如,單詞而不是常量,未聲明的變量被Zend運行時處理得相當好,因爲這是它的存在理由)。用'isset()'語法抑制通知並不比使用'@()'語言內建更聰明。如果整個推理是[微型優化](http://qkme.me/35ksv1),則更不明智。 – mario 2012-04-09 17:38:42

回答

3

當我看着你的代碼,例如

$this->_oldattributes['category_id'] 

我首先想到的是,這也許應該是一個類來代替。

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

的差別現在是,不需要使用isset()了,因爲現在的屬性存在(也許是null),或者它是definetely一個錯誤(「未定義的屬性」),並將其固定。我認爲你的大多數情況下,你與isset()「固定」,是這種類型。

+0

請檢查代碼示例 – llamerr 2012-04-09 17:48:32

+0

似乎我的問題是在啓用E_NOTICE的實時服務器上,所以我認爲我會接受這個答案並搜索這個問題,而不是,謝謝 – llamerr 2012-04-09 18:22:21

1

在調試代碼時,如果未定義應該定義的變量時未定義變量消息很好。 我認爲這是一個很好的習慣,在使用前定義你的變量,據我所知,其他語言比PHP更嚴格。

+0

這是對帖子的評論,而不是答案,請僅使用答案來回答答案。 – 2013-12-21 22:06:16

+3

@DaveA:不,這是一個答案,雖然是弱者 – Borodin 2013-12-22 01:10:35