0

thisなどの同様の質問がありますが、これは異なります-セッターを使用してコンストラクターパラメーターを検証することに関するものです。

ここに私のコンストラクタがあります:

public function __construct( $foo, $bar ) {
   try {
      $this->set_foo( $foo );
      $this->set_bar( $bar );
   } catch( Exception $e ) {
      echo 'Caught exception: ', $e->getMessage(), "\n"; 
   }
}

そして、これがセッターの1つです(疑似コード):

public function set_foo( $foo ) {
   if( $foo fails validation checks ) {
      throw new InvalidArgumentException( '$foo is not valid' );
   }
}

私のクラスには 2 つ以上のクラス変数があり、それぞれに独自の検証チェック セットがあります。だから私の質問です(まあ、本当に2):

PHP マジック getter/setter ( here ) を使用するようにコードを変更し、雑然とした__set( $name, $value )関数を使用する必要があるのはなぜですか? この関数には、必要な検証の種類を決定するための一連の条件が必要になるのに、なぜこの状況でこれを行う必要があるのでしょうか?

これらの魔法の方法の使用例は何ですか? 確かに、少数のクラス メンバーが存在する場合、または検証がない場合にのみ、適切な選択になるでしょうか?

どうもありがとう。

4

3 に答える 3

2

すべきではありません。IMO。

マジック セッターは、オブジェクトの外部からプライベート、保護、または仮想(存在しない)プロパティにアクセス (設定) することを目的としています。

プロパティごとに異なる検証ルールがある場合、すべてをチェックするために単一のメソッドをインフレートする必要がある理由がわかりません。現在のように、検証ロジックをさまざまなセッターメソッドに保持することをお勧めします。

編集

いくつかの一般的な検証ルールがある場合は、それらのルールを非パブリック メソッドに入れて、セッターから再利用する必要があります。

于 2012-10-25T08:35:22.003 に答える
1

私は通常、このような状況では魔法のゲッターとセッターを避け、アクセス可能である必要があるメンバーごとに特定のゲッターとセッターを持っています。適切なIDEまたはエディターを使用すると、ゲッターとセッターを自動的に生成できるため、特定のチェックを必要としないメンバーをサポートする作業はほとんどありません。

于 2012-10-25T08:38:15.720 に答える
1

便利なラッパーとして簡単に使用できます。

public function __set($name, $value) {
    $method = "set_$name";
    $this->$method($value);
}

$obj->foo = 'bar'これにより、の代わりに書くことができます$obj->set_foo('bar')

その価値はありますか?そうでないかもしれない。特に、クラス$this->set_foo() 内で使用する必要があるためです。マジック セッターを使用する必要があるとは誰も言いませんでした。

于 2012-10-25T08:32:48.567 に答える