我目前正在弄脏一些子类化面向对象的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...
这感觉效率低下,我觉得必须有更好的方法吗?在这种情况下是否存在通常使用的良好模式,或者我是否会以错误的方式解决这个问题?
答案 0 :(得分: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();
}