ООП и операторы переключения

У меня есть этот код ООП в PHP

class SSE {

static function setSection($opt_name,array $settings){
var_dump($settings["fields"]);

foreach ($settings["fields"] as $field){
self::processField($opt_name,$field);
}

}

static function processField($opt_name,array $field){

switch ($field["type"]){
case "number":
$number = new Number($field["title"],$field["desc"],$field["id"]);
echo "<br>$number";
break;
case "checkbox":
$checkbox = new Checkbox($field["title"],$field["desc"],$field["id"],$field["color"]);
echo "<br>$checkbox";
break;
}
}

}

class Input {

protected $title;
protected $desc;
protected $id;

}

class Number extends Input {

//protected $fields = array();

function __toString(){
return $this->title;
}

public function __construct($title,$desc,$id){
$this->title = $title;
$this->desc = $desc;
$this->id = $id;
}
}

class Checkbox extends Input {

//protected $fields = array();
protected $color;
function __toString(){
return $this->title;
}

public function __construct($title,$desc,$id,$color){
$this->title = $title;
$this->desc = $desc;
$this->id = $id;
$this->color = $color;
}
}

$test1 = array(
"title" => "Ssadassa",
"id" => "basic",
"desc" =>"this is a test",
"fields" => array(
array(
"title" => "Checkbox input",
"id" => "ba32132sic",
"desc" =>"this is a test",
"type"  => "checkbox",
"color" => "This is only for checkbox no another input should have this"),
array(
"title" => "Number input",
"id" => "basic",
"desc" =>"this is a test",
"type"  => "number")
)

);

SSE::setSection("da",$test1);

Что делать с оператором switch? Позже я могу добавить ввод textarea, и мне нужно перейти и отредактировать состояние switchmt. Я посмотрел здесь https://sourcemaking.com/design_patterns но я не знаю, подходит ли этот случай, может быть, фабрика понятия не имеет. Это моя первая попытка ООП.
Кстати, массив $ test1 нельзя менять, я имею в виду то, как кто-то использует эти предложения, должны быть одинаковыми. Любая помощь действительно приветствуется. Спасибо.
Изменить: Вопрос: что-то не так, если я использую оператор switch? Это лучший способ сделать это?

0

Решение

Вы можете создать карту классов и специальные методы для создания входных данных из опций.

class SSE { // please rename this

static private $mapClass = ['number' => 'Number', 'checkbox' => 'Checkbox'];

static function setSection($opt_name, array $settings) {
// var_dump($settings["fields"]);

foreach ($settings["fields"] as $field) {
self::processField($opt_name, $field);
}
}

static function processField($opt_name, array $field) {
// recognize class from class map
$class = self::$mapClass[$field["type"]];
$input = $class::createFromOptions($field);
echo "<br>$input";
}

}

class Input {

protected $title;
protected $desc;
protected $id;

}

class Number extends Input {

//protected $fields = array();

function __toString() {
return $this->title;
}

public function __construct($title, $desc, $id) {
$this->title = $title;
$this->desc = $desc;
$this->id = $id;
}

// create object from array
static public function createFromOptions(array $options) {
return new self($options["title"], $options["desc"], $options["id"]);
}

}

class Checkbox extends Input {

//protected $fields = array();
protected $color;

function __toString() {
return $this->title;
}

public function __construct($title, $desc, $id, $color) {
$this->title = $title;
$this->desc = $desc;
$this->id = $id;
$this->color = $color;
}

// create object from array
static public function createFromOptions(array $options) {
return new self($options["title"], $options["desc"], $options["id"], $options["color"]);
}

}

$test1 = array(
"title" => "Ssadassa",
"id" => "basic",
"desc" => "this is a test",
"fields" => array(
array(
"title" => "Checkbox input",
"id" => "ba32132sic",
"desc" => "this is a test",
"type" => "checkbox",
"color" => "This is only for checkbox no another input should have this"),
array(
"title" => "Number input",
"id" => "basic",
"desc" => "this is a test",
"type" => "number")
)
);

SSE::setSection("da", $test1);

Также вы можете добавить валидатор опций, чтобы убедиться, что все обязательные опции пропущены и нет никаких дополнительных опций.

Почему бы и нет ucfirst? Потому что вы можете использовать имя класса case для верблюда, например RichText (textarea with wysiwyg). Или напишите более умный распознаватель классов.

0

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

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

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