2011-10-27 2 views
1

XMLファイルの翻訳可能なコンテンツをクラスにロードするCIライブラリがあります。クラスは参照時にそのプロパティが定義されているかどうかを調べるmagic __getメソッドもしあればローカライズされたキーを返すか、またはキーインと_ _を付けて、もしそうでなければ翻訳が欠落していることを知らせます。魔法の__getメソッドを使用しているときの身元不明の警告を表示しない

すべてクールです。

しかし、これはオブジェクトのプロパティに依存するため、私はdebug(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 = new stdClassを残しました。しかし、あなたは私が__getにない 'property_exists'やその呼び出しを開始する参照で、警告がどこにトリガされたかに集中するのを助けました。 property_existsの前に@を置くと警告が表示されなくなりました。 – dmp

+1

エラーを抑えるために@を置くことは悪い習慣です。あなたはそれを使用しないでください。 – Buddy

+0

'$ this'を参照して翻訳をプロパティとして保存する場合、' __get'は存在しない場合にのみ呼び出されます。だからあなたはそれをチェックする必要はありません。代わりに、存在しない文字列を返すだけです。書かれているように、あなたはエラーを修正し、抑止してはいけません。 – hakre