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