
<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)
	{
		if (preg_match($this->deviation,$answer)){
			echo "На вопрос '$this->text' Вы дали правильный ответ('$answer')\n";
		} else{
		echo "На вопрос '$this->text' Вы дали неправильный ответ ('$answer'), правильный ответ ('$this->answer')\n";
		}
	}
}

// Функция, создающая массив с вопросами:
function createQuestions()
{
	// Создаем пустой массив
	$questions = array();
	
	// Создаем и заполняем первый объект
	$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)
{
	if (count($questions) == count($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>