Можно ли автоматически генерировать Геттер/Сеттер из значений массива в PHP?
Итак, у меня есть пара массивов
$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 answers
Вы можете использовать __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 для более подробного объяснения этих "волшебных" методов.
Вы можете использовать __call() (или __set() &&__get()), но у них есть некоторые накладные расходы.