2011-10-27 96 views
1

我有一個CI庫,它將XML文件中的可翻譯內容加載到類中,並且該類有一個magic __get方法,用於檢查該屬性是否在引用時定義,如果是的話返回本地化的關鍵字,或者是關鍵字加'_#',讓我知道如果沒有,翻譯就會丟失。使用magic__get方法時禁止未識別的屬性警告

都很酷。但是,因爲這一切都取決於對象的屬性,所以當我在調試(E_ALL)中運行時,我得到了很多'notice:undefined etc ..'警告,這很煩人。我不想禁用通知,但我想知道如何禁用這個特定的庫內(如果可能)。我可以在每次打電話給班的時候都放@,但是再一次,這太可怕了。

任何提示?

簡化代碼如下片段:

class MY_Translation 
{ 

    function _get_keys($lang) { 
     // load xml translations, could split this into different files.. 

     $translations = new DOMDocument(); 
     $translations->load($_SERVER['DOCUMENT_ROOT']."/xml/translations.xml"); 
     if ($translations) { 
      $words = $translations->getElementsByTagName("word"); 
      $count = 0; 
      foreach($words as $word){ 

       $name = $word->getAttribute('name'); 
       $trans = $word->childNodes; 

       if ($trans->length > 0) { 
        for($i = 0; $i < $trans->length; $i++) { 
         $child = $trans->item($i); 

         if ($child->nodeName == $lang) { 
          $this->$name = $child->nodeValue; 
         } 
        } 
       } 
      } 
     } 
    } 

    function __get($key){ 
     if (property_exists('MY_Translation',$this->$key)) { 
      return $this->$key; 
     } else { 
      return $key."_#"; 
     } 
    } 

} 

XML(僅供參考,所以很清楚發生了什麼):

<?xml version="1.0" encoding="UTF-8"?> 
<words> 
    <word name="thing"> 
     <en>thing en</en> 
     <pt>thing pt</pt> 
    </word> 
</words> 

回答

1

當您使用$this存儲翻譯,__get只呼籲不存在的特性。改變它,警告你只會通知你,你做錯了事:

function __get($key) 
{ 
    return $key."_#"; 
} 

這真的是你所需要做的。


您是不是要找的

$this->t->$key 

代替

$this->$key 

那麼你就需要修復的分配,以及:

$this->t->$name = ... 

一般情況下,當你在__get功能,你不會看到任何警告檢查的屬性。這些警告顯示你在程序邏輯中犯了一些錯誤,所以它們很有用,即使你的代碼很短,也不應該禁用它們。禁用警告不是解決方案,而是修復代碼。

讓我知道這是否有幫助。

+0

對不起,我遺漏了t =新的stdClass。但是,您幫助我專注於觸發警告的位置 - 「property_exists」不在__get上,也不在於啓動該調用的引用。將@放在property_exists的前面會抑制警告。 – dmp

+1

讓@來抑制錯誤是一種不好的做法。你應該避免使用它。 – Buddy

+0

如果您引用'$ this'來將翻譯存儲爲屬性,'__get'只會在不存在的情況下被調用。所以你甚至不需要檢查它。相反,只是返回它不會存在的字符串。正如所寫,你應該修正錯誤,而不是壓制它。 – hakre