Можно ли автоматически генерировать Getter / Setter из значений массива в PHP? - PullRequest
3 голосов
/ 08 июня 2010

Итак, у меня есть пара массивов

$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));
}

Ответы [ 2 ]

7 голосов
/ 08 июня 2010

Вы можете использовать __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.Вместо этого используйте специальные методы __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 для более подробного объяснения этих "магических" методов.

2 голосов
/ 08 июня 2010

Вы можете использовать __call () (или __set () && __get ()), но они имеют некоторые накладные расходы.

...