<pre>
<?php
// Базовый класс, содержит поля используемые
// во всех видах вопросов
abstract class AbstractQuestion
{
public $text;
public $type; //тип вопроса 1. choose - выбор 2. input - ввод | Такюе можно добавить еще новых типов
abstract function checkAnswer($answer);
}
// Вопрос с выбором вариантов
class ChoiceQuestion extends AbstractQuestion
{
public $options; // варианты ответа
public $correctOption; // правильный вариант
function checkAnswer($answer)
{
if($answer == $this->correctOption){
echo "На вопрос '$this->text' Вы дали правильный ответ('$this->correctOption') \n";
} else{
echo "На вопрос '$this->text ' Вы дали неправильный ответ('$answer'), правильный ответ ('$this->correctOption')\n";
}
}
}
// Вопрос с вводом числа
class NumericQuestion extends AbstractQuestion
{
public $answer; // ответ
public $deviation; // допустмая погрешность
function checkAnswer($answer)
{
echo "На вопрос '$this->text' Вы дали правильный ответ('$answer')\n";
} else{
echo "На вопрос '$this->text' Вы дали неправильный ответ ('$answer'), правильный ответ ('$this->answer')\n";
}
}
}
// Функция, создающая массив с вопросами:
function createQuestions()
{
// Создаем пустой массив
// Создаем и заполняем первый объект
$q = new ChoiceQuestion;
$q->text = "Кем является ОП?";
$q->options =["a" => "Няшей", "b" => "Программистом", "c" => "Хорошим человеком", "d" => "Все перечисленное"];
$q->correctOption = "d";
$q->type = "choose";
// Кладем вопрос в массив
$questions[] = $q;
// Создаем второй объект
$q = new ChoiceQuestion;
$q->text = "Какой город самый лучший?";
$q->options = ["a" => "Москва", "b" => "Токио", "c" => "Киев", "d" => "Это не объективный вопрос"];
$q->correctOption = "d";
$q->type = "choose";
// Кладем вопрос в массив
$questions[] = $q;
// Создаем третий объект
$q = new NumericQuestion;
$q->text = "Лежит груша — нельзя скушать, что это?";
$q->answer = "груша";
$q->deviation = "/лампа|лампочка/ui";
$q->type = "input";
// Кладем вопрос в массив
$questions[] = $q;
// Создаем четвертый объект
$q = new NumericQuestion;
$q->text = "Чему равно 2+2*2?";
$q->answer = "6";
$q->deviation = "/^6|шесть$/ui";
$q->type = "input";
// Кладем вопрос в массив
$questions[] = $q;
// Возвращаем массив из объектов-вопросов
return $questions;
}
// Выводим вопросы
function printQuestions($questions)
{
$number = 1; // номер вопроса
foreach ($questions as $question) {
echo "{$number}. {$question->text}\n\n";
//если вопрос с вариантами ответа то
if($question->type == "choose"){
echo "Варианты ответов:\n";
foreach ($question->options as $letter => $answer) {
echo " {$letter}. {$answer}\n";
}
} elseif($question->type = "input"){
echo "Введите ваш ответ:\n\n";
}
$number++;
}
}
// Проверяем ответы на правильность и выводим значения
function checkAnswer($questions, $answers)
{
for($i = 0; $i < count($questions); $i++){ $questions[$i]->checkAnswer($answers[$i]);
}
} else{
die("Число ответов и вопросов не совпадает\n"); }
}
$answers = ["с", "d", "не знаю", "шесть"];
$questions = createQuestions();
printQuestions($questions);
checkAnswer($questions, $answers);
?>
</pre>