マジック__getメソッドを使用するときに不明なプロパティの警告を抑制する

XMLファイルから翻訳可能なコンテンツをクラスにロードするCIライブラリがあります。クラスには、参照時にそのプロパティが定義されているかどうかをチェックし、ローカライズされたキーを返す場合はkeyname plus '_#'を押すと翻訳が欠落していることがわかります。

すべてクール。

しかし、これはすべてオブジェクトのプロパティに依存するため、私はデバッグ(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"?>

    
        thing en
        thing pt
    

1

1 答え

$ this を使用して翻訳を保存すると、存在しないプロパティに対してのみ __ get が呼び出されます。それを変更すると、警告は、あなたが何か間違っていることを通知するだけです:

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

それは本当にあなたがする必要があります。


もしかして

$this->t->$key

の代わりに

$this->$key

次に、割り当てを修正する必要があります。

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

一般的に、 __ get 関数内のプロパティをチェックするときは、警告は表示されません。警告は、あなたがあなたのプログラムロジックに何らかのエラーを起こしていることを示しているので、それらは有用であり、コードの短い部分でもそれらを無効にしてはいけません。警告を無効にすることは解決策ではなく、コードを修正することです。

これが役に立つのかどうか教えてください。

1
追加された
$ this を参照して翻訳をプロパティとして保存する場合、 __ get は存在しない場合にのみ呼び出されます。だからあなたはそれをチェックする必要はありません。代わりに、存在しない文字列を返すだけです。書かれているように、あなたはエラーを修正し、抑止してはいけません。
追加された 著者 hakre,
@ダンピング:私は答えを編集し、あなたに必要な機能を追加しました。
追加された 著者 hakre,
@Danp:デフォルトの設定では、警告は例外をトリガーしません。しかし、あなたは間違った場所を見ている。コードを修正すると、警告はすでに質問に気付いたようにエラーを見つけるのに役立ちます。それは正しい方向です。それに固執 ;)
追加された 著者 hakre,
申し訳ありませんが、私は間違ってt = new stdClassを残しました。しかし、あなたは私が__getにない 'property_exists'やその呼び出しを開始する参照で、警告がどこにトリガされたかに集中するのを助けました。 property_existsの前に@を置くと警告が表示されなくなりました。
追加された 著者 dmp,
警告によって例外がトリガーされますか?例外を処理した場合でも、表示通知が表示されますか?
追加された 著者 dmp,
hakre:完璧です。
追加された 著者 dmp,
エラーを抑えるために@を置くことは悪い習慣です。あなたはそれを使用しないでください。
追加された 著者 Buddy,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com