3

だから私はいくつかの配列を持っています

$array_1 = Array('one','two','three');
$array_2 = Array('red','blue','green');

単一の値のエントリを持つ配列のセッターとゲッターを動的に作成する方法はありますか?

したがって、クラスは次のようになります。

class xFromArray() {

}

したがって、上記で$ array_1を渡すと、次のようになります。

private $one;

setOne($x) {
   $one = $x;
}

getOne() {
   return $one;
}

$ array_2を渡すと、次のようなものが生成されます。

private $red;

setRed($x) {
   $red = $x;
}

getRed() {
   return $red;
}

だから私はそれをどういうわけかこのように呼ぶでしょうか?(私の最善の推測ですが、これがうまくいくとは思われません)

$xFromArray = new xFromArray;
foreach($array_1 as $key=>$data) {
   $xFromArray->create_function(set.ucfirst($data)($data));
   echo $xFromArray->create_function(get.ucfirst($data));
}
4

2 に答える 2

7

を使用__call()して動的メソッドを呼び出すことができます。そう:

class Wrapper {
  private $properties;

  public function __construct(array $names) {
    $this->properties = array_combine(array_keys($names),
      array_fill(0, count($names), null));
  }

  public function __call($name, $args) {
    if (preg_match('!(get|set)(\w+)!', $name, $match)) {
      $prop = lcfirst($match[2]);
      if ($match[1] == 'get') {
        if (count($args) != 0) {
          throw new Exception("Method '$name' expected 0 arguments, got " . count($args));
        }
        return $properties[$prop];
      } else {
        if (count($args) != 1) {
          throw new Exception("Method '$name' expected 1 argument, got " . count($args));
        }
        $properties[$prop] = $args[0];
      }
    } else {
      throw new Exception("Unknown method $name");
    }
  }
}

個人的には、PHP で getter と setter を使用するルートには行きません。(ほとんどの場合不要な) メソッド ラッパーを追加するのではなく、代わりに特別なメソッド__get()を使用して、これらの動的プロパティをオブジェクト プロパティとして扱います。__set()

編集:明確にするために、__call()存在しないかアクセスできないオブジェクトでメソッドを呼び出すと呼び出されます。そう:

$wrapper = new Wrapper($array_1);
$wrapper->setOne("foo");
echo $wrapper->getOne(); // foo
$wrapper->getAbc(); // exception, property doesn't exist

__call()メソッド名を解読するためにここで使用されます。get または set の後に (初期配列からの) プロパティ名が続くパターンに適合する場合は、期待どおりに機能しますが、そうでない場合は例外をスローします。もちろん、この動作は自由に変更できます。

これらの「マジック」メソッドの詳細な説明については、PHP マニュアルのオーバーロードを参照してください。

于 2010-06-08T15:01:33.523 に答える
2

__call() (または __set() && __get()) を使用できますが、多少のオーバーヘッドがあります。

于 2010-06-08T15:01:59.450 に答える