oop — динамическое создание экземпляра класса на основе строки в переполнении стека

Я в настоящее время пачкаю руки с помощью некоторого объектно-ориентированного php. Я хотел бы использовать массив для создания некоторых полей формы, и эти поля разделены на классы в зависимости от их типа. Это означает, что у меня есть основной класс с именем «form_field», а затем есть группа подклассов с именем «form_field_type» (например, «form_field_select»). Идея состоит в том, что каждый подкласс «знает», как лучше всего генерировать свой HTML в методе отображения.

Итак, давайте скажем, что я пишу массив, как это:

$fields = array(
array(
'name' => 'field1',
'type' => 'text',
'label' => 'label1',
'description' => 'desc1',
'required' => true,
),
array(
'name' => 'field2',
'type' => 'select',
'label' => 'label1',
'description' => 'desc1',
'options' => array(
'option1' => 'Cat',
'option2' => 'Dog',
),
'ui' => 'select2',
'allow_null' => false,
)
);

Затем я хотел бы создать цикл, который создает правильный класс на основе типа:

foreach ($fields as $field) {
$type = $field['type'];

$new_field = // instantiate the correct field class here based on type

$new_field->display();
}

Какой будет лучший подход здесь? Я хотел бы не делать что-то вроде:

if ($type == 'text') {
$new_field = new form_field_text();
} else if ($type == 'select') {
$new_field = new form_field_select();
} // etc...

Это просто кажется неэффективным, и я чувствую, что должен быть лучший способ? Есть ли хороший пример, который обычно используется в этой ситуации, или я собираюсь решить эту проблему неправильно?

1

Решение

Попробуйте что-то вроде этого …

foreach ($fields as $field) {
$type = $field['type'];

// instantiate the correct field class here based on type
$classname = 'form_field_' .$type;
if (!class_exists($classname)) { //continue or throw new Exception }

// functional
$new_field = new $classname();

// object oriented
$class = new ReflectionClass($classname);
$new_field = $class->newInstance();

$new_field->display();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]