2012-02-24 8 views
1

私のオーバーロードされたすべての__get関数は、この例のようにhttp://us3.php.net/manual/en/language.oop5.overloading.php#object.issetになり、デバッグコードが含まれていますか?PHP __get overload code良い練習

public function __get($name) 
{ 
    echo "Getting '$name'\n"; 
    if (array_key_exists($name, $this->data)) { 
     return $this->data[$name]; 
    } 

    /*question specific code from here on*/ 

    $trace = debug_backtrace(); 
    trigger_error(
     'Undefined property via __get(): ' . $name . 
     ' in ' . $trace[0]['file'] . 
     ' on line ' . $trace[0]['line'], 
     E_USER_NOTICE); 
    return null; 
} 

すべてのクラスにオーバーロードが含まれていると、重複したコードが多くなる可能性があります。

+0

継承または静的ヘルパークラスについて考えましたか? – rcdmk

答えて

0

debug_backtrace()trigger_error()の代わりに例外をスローします。

それは状況にもかかわらずです。キーが存在しない場合は、別の操作を行うこともできます。

0

このような場合には「良い習慣」はありません。

  1. トリガー通知/
  2. は例外
  3. 戻るnullを投げる(あなたの例のように)警告(:

    オブジェクト期待される動作に応じて、あなた(それは、何よりもタスクに依存します)またはその他の既定値)

0

いいえこの例では、メンバー変数をとり、配列メンバー変数に格納します。どこにでもオーバーロードするべきではありません。これを親クラスに入れ、継承させる必要があります。

また、エラーを引き起こす出力は古い学校です。新しい例外クラスを作成し、代わりにそれをスローします(PropertyNotFoundExceptionなど)。

0

あなたは、少しDRYerになるであろうグローバルなユーティリティー関数で使用することになるすべての例外処理をラップすることができます。また、AOPライブラリを使用して、既存のクラスにこの機能を組み込むこともできます。

1

いいえ、オーバーロードされた__get関数は、この例のようには見えません。

IMHO、これらの魔法の機能を避けることをお勧めします。彼らは魅力的だと思われますが、この「魔法」を使用すると、保守が難しいコードになります。少なくとも、これは私の経験でした。

今日私が「従う」原則の1つは、「IDEに優しい」クラスを持つことです。つまり、私がEclipse PDTを使用していて、$variableが所定のクラスである場合、オートコンプリートは利用可能なすべてのメソッドとプロパティを表示する必要があります。これらの魔法の方法を使って、私たちは何が入手可能かを決して知ることができません。

これは一般的なアドバイスに過ぎません。具体的なケースには該当しない場合があります。

関連する問題