の唯一の利点は__get()
コードが少なくて済むことですが、それでも必ずしもそうとは限りません。たとえば、10 個のプライベート メンバーのセットがあり、getter に 5 個を公開させたい__get()
場合、疑似可視メンバーの 1 つが呼び出された場合に送信するように記述する必要があります。それ以外の場合は、エラーを発行するか (エラーがなくても自然に発生するか、実際には役に立たない__get()
ような値を返します。null
ゲッターとセッターを一般的に使用することを提案する人を非難する必要があります。これは通常、アーキテクチャに問題があることを示しています。たとえば、次の 2 つのコード ブロックの概念的な違いを説明してください。
class _ {
public $_;
}
対。
class _ {
private $_;
public function get_() {
return $this->_;
}
}
違いはありません。
ただし、getter を使用することの利点として、多くの人が指摘するように、これにより、何らかの方法で戻り値を透過的に変更して、受信者に役立つようにすることができます。ただし、アーキテクチャの問題に戻ります。何らかの理由でクラスの内容を公開する必要はまったくありません。代わりに、アクションを実行するようにクラスに指示する必要があります (状態によって異なる場合があります)。ゲッターを使用すると、通常、クラスの状態を照会し、表示された状態に基づいて外部でアクションを実行できます。
セッターとセッターに対して本質的に同じ議論__set()
がありますが、あなたができる素晴らしいことが1つあり__set()
ます:
class _ {
private $_ = array();
public function __set($key, $val) {
$this->_[$key] = $val;
}
}
これにより、とても素敵な$_obj->key = 'val'
. これと大きな違いはなくadd()
、キーと値を取り、同じことを行うような別のメソッドを追加することに注意してください。私はオブジェクトセッター表記を好みます。