Я в настоящее время пачкаю руки с помощью некоторого объектно-ориентированного 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...
Это просто кажется неэффективным, и я чувствую, что должен быть лучший способ? Есть ли хороший пример, который обычно используется в этой ситуации, или я собираюсь решить эту проблему неправильно?
Попробуйте что-то вроде этого …
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();
}
Других решений пока нет …