<?php
error_reporting(-1);

// Общий вопрос
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;
    }
}