2014-09-21 77 views
1

我目前正在使用一些面向對象的子類化php來弄髒我的手。我想使用一個數組來創建一些表單域,並且這些域根據它們的類型被分成不同的類。這意味着我有一個名爲「form_field」的主類,然後有一堆名爲「form_field_type」(例如「form_field_select」)的子類。這個想法是,每個子類都「知道」如何在顯示方法中最好地生成他們的HTML。基於PHP中的字符串動態實例化一個類

因此,可以說,我寫一個這樣的數組:

$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

我想你應該承擔的工廠設計模式看看。 – Sascha 2014-09-21 14:38:26

+0

可能的重複:http://stackoverflow.com/questions/4578335/creating-php-class-instance-with-a-string – algorhythm 2014-09-21 14:45:28

回答

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