Advertisement
Guest User

Объекты в PHP

a guest
Jul 30th, 2013
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.56 KB | None | 0 0
  1. Объекты в PHP
  2.  
  3. В этом уроке мы узнаем, что такое объекты и классы, как их использовать и для чего они нужны.
  4.  
  5. Как ты, помнишь, в PHP существуют данные разных типов: числа, строки, а также массивы. Еще один тип — это объекты.
  6.  
  7. Объект — это такая штука, которая содержит внутри себя переменные (они называются поля, свойства или члены) и функции (которые называют методами). Каждый объект относится к определенному классу (виду). Класс определяет, какие именно поля и методы есть в объекте, например «все объекты класса X имеют поля field1, field2 и field3». Классы описывает программист, то есть ты.
  8.  
  9. Порядок работы с объектами такой:
  10.  
  11. 1) объявляем класс
  12. 2) создаем один или несколько объектов этого класса
  13. 3) используем их для решения задачи
  14.  
  15. Объекты используются обычно для того, чтобы хранить свойства каких-то сущностей (предметов), с которыми работает программа. В этом уроке мы напишем программу для проверки знаний, которая умеет задавать вопросы и считать число правильных ответов. Попробуем написать класс Question, объекты которого будут хранить в себе информацию о вопросе и вариантах ответа на него (один объект соответствует одному вопросу).
  16.  
  17. Объект чем-то напоминает массив (в котором тоже может содержаться много элементов), но разница в том, что в массив можно добавить любое число элементов с любыми индексами, а поля объекта задаются в определении класса.
  18.  
  19. Итак, у нас есть сущность «Вопрос» и у нее есть такие свойства: «текст вопроса», «число баллов за правильный ответ», «варианты ответов», «правильный ответ». Опишем соответствующий класс:
  20.  
  21. class Question
  22. {
  23. public $text; // текст вопроса
  24. public $points; // число баллов
  25. public $answers; // варианты ответов
  26. public $correctAnswer; // правильный ответ
  27. }
  28.  
  29. Этот код создает новый класс Question и определяет, что у всех объектов этого класса есть свойства text, points, answers и correctAnswers. Слово «public» обозначает, что эти свойства можно читать и менять из любого места программы (доступ к свойству объекта можно ограничить, но это мы изучим позже). Сам по себе этот код только объявляет класс и больше ничего не делает. Давай теперь создадим несколько объектов класса Question и заполним их поля полезными значениями. Объект создается с помощью оператора new, которому надо указать, какого класса объект мы хотим создать.
  30.  
  31. // Создадим три объекта (так как у нас будет 3 вопроса в тесте), и сохраним их в трех переменных:
  32. $q1 = new Question;
  33. $q2 = new Question;
  34. $q3 = new Question;
  35.  
  36. // Выведем содержимое объекта
  37. var_dump($q1);
  38.  
  39. Когда мы создаем новый объект, всем его полям присваивается значение null. Потому наши объекты пусты. Обратиться к полю объекта можно с помощью оператора «->», напоминающего стрелочку. Слева пишется переменная, хранящая объект, а справа — имя поля. Используется он так:
  40.  
  41. $object->field = 4;
  42.  
  43. Давай теперь заполним наши объекты вопросами и ответами. Поскольку у одного вопроса может быть несколько ответов, то мы используем массив для их хранения:
  44.  
  45. // Вопрос 1
  46. $q1 = new Question;
  47. $q1->text = "Какая планета располагается четвертой по счету от Солнца?";
  48. $q1->points = 10; // 10 баллов за ответ
  49. $q1->answers = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий'); // Варианты ответа
  50. $q1->correctAnswer = 'b'; // Правильный ответ
  51.  
  52. // Вопрос 2
  53. $q2 = new Question;
  54. $q2->text = 'Какой город является столицей Великобритании?';
  55. $q2->points = 5;
  56. $q2->answers = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон');
  57. $q2->correctAnswer = 'd';
  58.  
  59. // Вопрос 3
  60. $q3 = new Question;
  61. $q3->text = 'Кто придумал теорию относительности?';
  62. $q3->points = 30;
  63. $q3->answers = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон');
  64. $q3->correctAnswer = 'c';
  65.  
  66. // Выведем содержимое, чтобы проверить, что все верно
  67. var_dump($q1, $q2, $q3);
  68.  
  69. Ок, мы объявили класс, создади 3 объекта с вопросами. Теперь надо их вывести. Прежде чем писать код, давай сделаем небольшое улучшение: во-первых, заводить на каждый вопрос переменную — неудобно, когда вопросов станет много, наш код станет ужасен. Давай лучше сделаем массив и будем добавлять объекты-вопросы в него. Второе улучшение — мы завернем код создания объектов в функцию, так как наша программа становится большой и надо разбивать ее на отдельные части, чтобы не превратить в длинную нечитаемую портянку. Вот, что выходит в итоге:
  70.  
  71. // Функция, создающая массив с вопросами:
  72. function createQuestions()
  73. {
  74. $questions = array();
  75.  
  76. $q = new Question;
  77. $q->text = ...
  78. ...
  79. // Кладем вопрос в массив
  80. $questions[] = $q;
  81.  
  82. $q = new Question;
  83. ...
  84.  
  85. return $questions;
  86. }
  87.  
  88. Теперь мы можем продолжить. Давай напишем функцию, выводящую список вопросов с вариантами ответов. На вход функции, естественно, надо дать массив с вопросами. Используем цикл для обходя всех вопросов и выведем для каждого текст и варианты ответов (для вывода ответов используем вложенный цикл):
  89.  
  90. function printQuestions($questions)
  91. {
  92. $i = 1; // номер вопроса
  93.  
  94. foreach ($questions as $question) {
  95. echo "{$i}. {$question->text}\n\n";
  96.  
  97. echo "Варианты ответов:\n";
  98.  
  99. foreach ($question->answers as $letter => $answer) {
  100. echo " {$letter}. {$answer}\n";
  101. }
  102.  
  103. $i++;
  104. }
  105. }
  106.  
  107. Теперь осталось создать объекты-вопросы, вызвав первую функцию, и вывести их с помощью второй:
  108.  
  109. $questions = createQuestions();
  110. printQuestions($questions);
  111.  
  112. Прекрасно! Давай теперь напишем еще и код для проверки ответов и выставления баллов. Было бы хорошо сделать интерактивный тест (который выводит вопросы и ждет, пока пользователь введет ответы), но так как мы используем ideone, то сделать это сложно, потому для простоты давай предположим, что мы уже собрали ответы и поместили их в массив. Пусть, например, массив содержит буквы a-d для каждого вопроса:
  113.  
  114. $answers = array('b', 'd', 'a');
  115.  
  116. Мы хотим проверить ответы, посчитать число баллов и вывести вопросы, на который дан неправильный ответ. Очевидно, нам для этого нужна еще одна функция.
  117.  
  118. function checkAnswers($questions, $answers)
  119. {
  120. // Проверим, что число ответов равно числу вопросов (защищаемся от ошибки)
  121. if (count($questions) != count($answers)) {
  122. die("Число ответов и вопросов не совпадает\n");
  123. }
  124.  
  125. $pointsTotal = 0; // сколько набрано баллов
  126. $pointsMax = 0; // сколько можно набрать баллов при всех правильных ответах
  127. $correctAnswers = 0; // сколько отвечено верно
  128. $totalQuestions = count($questions); // Сколько всего вопросов
  129.  
  130. // Цикл для обхода вопросов и ответов
  131. for ($i = 0; $i < count($questions); $i++) {
  132. $question = $questions[$i]; // Текущий вопрос
  133. $answer = $naswers[$i]; // текущий ответ
  134.  
  135. // Считаем максимальную сумму баллов
  136. $pointsMax += $question->points;
  137.  
  138. // Проверяем ответ
  139. if ($answer == $question->correctAnswer) {
  140. // Добавляем баллы
  141. $correctAnswers ++;
  142. $pointsTotal += $question->points;
  143. } else {
  144. // Неправильный ответ
  145. $number = $i + 1;
  146. echo "Неправильный ответ на вопрос №{$number} ({$question->text})\n";
  147. }
  148. }
  149.  
  150. // Выведем итог
  151. echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: ? из ?\n";
  152. }
  153.  
  154. Ну и теперь надо вызвать эту функцию, чтобы проверить ответы:
  155.  
  156. $questions = createQuestions();
  157. printQuestions($questions);
  158. $answers = array('b', 'd', 'a');
  159. checkAnswers($questions, $answers);
  160.  
  161. Запустим программу:
  162.  
  163. ....
  164.  
  165. Ты можешь спросить, почему она пишет знаки вопроса вместо числа баллов? Хе-хе, потому что это часть домашнего задания для тебя, которое поможет закрепить тебе знания. Собственно, вот и задача:
  166.  
  167. 1) доработай программу, чтобы она выводила набранное число баллов и максимально возможное вместо знаков вопроса.
  168. 2) сделай функцию в программе, чтобы у каждого вопроса была подсказка и при неправильном ответе выводилась эта подсказка. Тебе для этого понадобится добавить в класс еще одно поле, в котором она будет храниться.
  169.  
  170.  
  171.  
  172. http://archive-ipq-co.narod.ru/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement