3

所以我有几个数组

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

是否有一种动态方法可以为具有单值条目的数组创建 Setter 和 Getter?

所以这个类将是这样的:

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 回答