Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Объекты в PHP
- В этом уроке мы узнаем, что такое объекты и классы, как их использовать и для чего они нужны.
- Как ты, помнишь, в PHP существуют данные разных типов: числа, строки, а также массивы. Еще один тип — это объекты.
- Объект — это такая штука, которая содержит внутри себя переменные (они называются поля, свойства или члены) и функции (которые называют методами). Каждый объект относится к определенному классу (виду). Класс определяет, какие именно поля и методы есть в объекте, например «все объекты класса X имеют поля field1, field2 и field3». Классы описывает программист, то есть ты.
- Порядок работы с объектами такой:
- 1) объявляем класс
- 2) создаем один или несколько объектов этого класса
- 3) используем их для решения задачи
- Объекты используются обычно для того, чтобы хранить свойства каких-то сущностей (предметов), с которыми работает программа. В этом уроке мы напишем программу для проверки знаний, которая умеет задавать вопросы и считать число правильных ответов. Попробуем написать класс Question, объекты которого будут хранить в себе информацию о вопросе и вариантах ответа на него (один объект соответствует одному вопросу).
- Объект чем-то напоминает массив (в котором тоже может содержаться много элементов), но разница в том, что в массив можно добавить любое число элементов с любыми индексами, а поля объекта задаются в определении класса.
- Итак, у нас есть сущность «Вопрос» и у нее есть такие свойства: «текст вопроса», «число баллов за правильный ответ», «варианты ответов», «правильный ответ». Опишем соответствующий класс:
- class Question
- {
- public $text; // текст вопроса
- public $points; // число баллов
- public $answers; // варианты ответов
- public $correctAnswer; // правильный ответ
- }
- Этот код создает новый класс Question и определяет, что у всех объектов этого класса есть свойства text, points, answers и correctAnswers. Слово «public» обозначает, что эти свойства можно читать и менять из любого места программы (доступ к свойству объекта можно ограничить, но это мы изучим позже). Сам по себе этот код только объявляет класс и больше ничего не делает. Давай теперь создадим несколько объектов класса Question и заполним их поля полезными значениями. Объект создается с помощью оператора new, которому надо указать, какого класса объект мы хотим создать.
- // Создадим три объекта (так как у нас будет 3 вопроса в тесте), и сохраним их в трех переменных:
- $q1 = new Question;
- $q2 = new Question;
- $q3 = new Question;
- // Выведем содержимое объекта
- var_dump($q1);
- Когда мы создаем новый объект, всем его полям присваивается значение null. Потому наши объекты пусты. Обратиться к полю объекта можно с помощью оператора «->», напоминающего стрелочку. Слева пишется переменная, хранящая объект, а справа — имя поля. Используется он так:
- $object->field = 4;
- Давай теперь заполним наши объекты вопросами и ответами. Поскольку у одного вопроса может быть несколько ответов, то мы используем массив для их хранения:
- // Вопрос 1
- $q1 = new Question;
- $q1->text = "Какая планета располагается четвертой по счету от Солнца?";
- $q1->points = 10; // 10 баллов за ответ
- $q1->answers = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий'); // Варианты ответа
- $q1->correctAnswer = 'b'; // Правильный ответ
- // Вопрос 2
- $q2 = new Question;
- $q2->text = 'Какой город является столицей Великобритании?';
- $q2->points = 5;
- $q2->answers = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон');
- $q2->correctAnswer = 'd';
- // Вопрос 3
- $q3 = new Question;
- $q3->text = 'Кто придумал теорию относительности?';
- $q3->points = 30;
- $q3->answers = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон');
- $q3->correctAnswer = 'c';
- // Выведем содержимое, чтобы проверить, что все верно
- var_dump($q1, $q2, $q3);
- Ок, мы объявили класс, создади 3 объекта с вопросами. Теперь надо их вывести. Прежде чем писать код, давай сделаем небольшое улучшение: во-первых, заводить на каждый вопрос переменную — неудобно, когда вопросов станет много, наш код станет ужасен. Давай лучше сделаем массив и будем добавлять объекты-вопросы в него. Второе улучшение — мы завернем код создания объектов в функцию, так как наша программа становится большой и надо разбивать ее на отдельные части, чтобы не превратить в длинную нечитаемую портянку. Вот, что выходит в итоге:
- // Функция, создающая массив с вопросами:
- function createQuestions()
- {
- $questions = array();
- $q = new Question;
- $q->text = ...
- ...
- // Кладем вопрос в массив
- $questions[] = $q;
- $q = new Question;
- ...
- return $questions;
- }
- Теперь мы можем продолжить. Давай напишем функцию, выводящую список вопросов с вариантами ответов. На вход функции, естественно, надо дать массив с вопросами. Используем цикл для обходя всех вопросов и выведем для каждого текст и варианты ответов (для вывода ответов используем вложенный цикл):
- function printQuestions($questions)
- {
- $i = 1; // номер вопроса
- foreach ($questions as $question) {
- echo "{$i}. {$question->text}\n\n";
- echo "Варианты ответов:\n";
- foreach ($question->answers as $letter => $answer) {
- echo " {$letter}. {$answer}\n";
- }
- $i++;
- }
- }
- Теперь осталось создать объекты-вопросы, вызвав первую функцию, и вывести их с помощью второй:
- $questions = createQuestions();
- printQuestions($questions);
- Прекрасно! Давай теперь напишем еще и код для проверки ответов и выставления баллов. Было бы хорошо сделать интерактивный тест (который выводит вопросы и ждет, пока пользователь введет ответы), но так как мы используем ideone, то сделать это сложно, потому для простоты давай предположим, что мы уже собрали ответы и поместили их в массив. Пусть, например, массив содержит буквы a-d для каждого вопроса:
- $answers = array('b', 'd', 'a');
- Мы хотим проверить ответы, посчитать число баллов и вывести вопросы, на который дан неправильный ответ. Очевидно, нам для этого нужна еще одна функция.
- function checkAnswers($questions, $answers)
- {
- // Проверим, что число ответов равно числу вопросов (защищаемся от ошибки)
- if (count($questions) != count($answers)) {
- die("Число ответов и вопросов не совпадает\n");
- }
- $pointsTotal = 0; // сколько набрано баллов
- $pointsMax = 0; // сколько можно набрать баллов при всех правильных ответах
- $correctAnswers = 0; // сколько отвечено верно
- $totalQuestions = count($questions); // Сколько всего вопросов
- // Цикл для обхода вопросов и ответов
- for ($i = 0; $i < count($questions); $i++) {
- $question = $questions[$i]; // Текущий вопрос
- $answer = $naswers[$i]; // текущий ответ
- // Считаем максимальную сумму баллов
- $pointsMax += $question->points;
- // Проверяем ответ
- if ($answer == $question->correctAnswer) {
- // Добавляем баллы
- $correctAnswers ++;
- $pointsTotal += $question->points;
- } else {
- // Неправильный ответ
- $number = $i + 1;
- echo "Неправильный ответ на вопрос №{$number} ({$question->text})\n";
- }
- }
- // Выведем итог
- echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: ? из ?\n";
- }
- Ну и теперь надо вызвать эту функцию, чтобы проверить ответы:
- $questions = createQuestions();
- printQuestions($questions);
- $answers = array('b', 'd', 'a');
- checkAnswers($questions, $answers);
- Запустим программу:
- ....
- Ты можешь спросить, почему она пишет знаки вопроса вместо числа баллов? Хе-хе, потому что это часть домашнего задания для тебя, которое поможет закрепить тебе знания. Собственно, вот и задача:
- 1) доработай программу, чтобы она выводила набранное число баллов и максимально возможное вместо знаков вопроса.
- 2) сделай функцию в программе, чтобы у каждого вопроса была подсказка и при неправильном ответе выводилась эта подсказка. Тебе для этого понадобится добавить в класс еще одно поле, в котором она будет храниться.
- http://archive-ipq-co.narod.ru/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement