<?php
 
// Общий вопрос
class Question
{
    public $text;
 
    public $details;
}
 
class ChoiceQuestionDetails
{
    public $options;
    public $correntOption;
 
    public function checkAnswer($answer)
    {
        if ($this->correntOption == $answer) {
            return true;
        } else {
            return false;
        }
    }
 
    public function printQuestions()
    {
        # Вывод вопроса
        echo '' . PHP_EOL;
        foreach ($this->options as $letter => $option) {
            echo "{$letter}. {$option}" . PHP_EOL;
        }
        echo '' . PHP_EOL;
    }
}
 
class NumericQuestionDetails
{
    public $answer;
    public $deviation;
 
    public function checkAnswer($myAnswer)
    {
        if ($this->deviation >= (abs($myAnswer - $this->answer))) {             return true;
        } else {
            return false;
        }
    }
 
    public function printQuestions()
    {
        echo '' . PHP_EOL;
    }
}
 
$questions = []; // список всех вопросов
$numericQuestions = []; // список деатлей вопросов с вводом числа
$choiceQustions = []; //// список деатлей вопросов с выбором ответа
// Первый вопрос
$question = new Question;
$question->text = '1 + 1 =';
$questions[1] = $question;
 
// Второй вопрос
$question = new Question;
$question->text = '1 + 2 =';
$questions[2] = $question;
 
// Детали вопроса 1 с вводом числа
$numericQuestion = new NumericQuestionDetails;
$numericQuestion->answer = 2;
$numericQuestion->deviation = 0;
$numericQuestions[1] = $numericQuestion;
 
// Детали вопроса 1 с выбором овтета
$choiceQustion = new ChoiceQuestionDetails;
$choiceQustion->options = ['a' => '1', 'b' => '2'];
$choiceQustion->correntOption = 'b';
$choiceQustions[1] = $choiceQustion;
 
// Детали вопроса 2 с вводом числа
$numericQuestion = new NumericQuestionDetails;
$numericQuestion->answer = 3;
$numericQuestion->deviation = 0;
$numericQuestions[2] = $numericQuestion;
 
// Детали вопроса 2 с выбором ответа
$choiceQustion = new ChoiceQuestionDetails;
$choiceQustion->options = ['a' => '2', 'b' => '3'];
$choiceQustion->correntOption = 'b';
$choiceQustions[2] = $choiceQustion;
 
$questions[1]->details = $choiceQustions[1];
$questions[2]->details = $numericQuestions[2];
 
$numberQ = 1;
 
foreach ($questions as $question) {
    echo "{$numberQ}) ";
    echo $question->text;
    $a = $question->details->printQuestions(); // корректна ли такая запись ?
    $numberQ++;
}
 
$answers = ['b', 3];
echo PHP_EOL . 'Проверяем введенные ответы' . PHP_EOL;
 
for ($i = 1; $i <= count($questions); $i++) {     echo "{$i}) ";
    if ($questions[$i]->details->checkAnswer($answers[$i-1])) {
        echo 'Верно' . PHP_EOL;
    } else {
        echo 'Не верно' . PHP_EOL;
    }
}