Уроки PHP.
Урок 13. Принципы ООП и классы.
Масса явлений, оставшихся без сознания, становятся
объектами представлений. Эмиль Дюркгейм
Сегодня мы с вами познакомимся с принципами объектно-ориентированного
программирования и их реализацией в PHP.
Многие недолюбливают эту тему и изучают ее поверхностно. Но все же без
понимания ООП будет трудно создать что-то существенное, тем более практически
все современные языки программирования являются обектно-ориентированными. Тем
самым, поняв эту тему однажды, не придется к ней возвращаться, если вы захотите
изучить другой язык.
Принципы ООП.
Давайте вдумаемся в эти слова "объектно-ориентированный". Они подразумевают,
что какая-то деятельность направлена на определенный объект. Объектами в нашей
повседневной жизни выступают все окружающие нас предметы: автомобили, книги,
стол, CD, домашние тапочки в конце концов.
Рассмотрим такой объект, как телевизор. Внутри этого объекта находятся
множество других объектов: микросхемы, провода, электронно-лучевая трубка и так
далее. Но при взаимодействии с телевизором мы об этом даже и не задумываемся. В
этом заключается первый принцип ООП - инкапсуляция.
Мы также знаем, что, нажав на определенную кнопку, мы включим телевизор, а
удерживая другую - увеличим или уменьшим громкость. При этом от объекта мы
получаем только результат его работы, не задумываясь о его внутренних процессах.
Это составляет второй принцип - абстракцию.
Наконец, третий принцип, составляющий парадигму ООП, называется
наследованием. Он заключается в том, что, например, цветной телевизор
произошел от черно-белого, а телевизор с плазменным экраном - от обыкновенного.
При этом каждый потомок наследовал свойства и функции предшественника, дополняя
их своими, качественно новыми. Наследование позволяет расширить возможности
объекта, не создавая при этом новый объект с нуля.
Классы в PHP.
Класс служит шаблоном для объекта. Он создается следующим образом:
class Myclass { // определение класса } |
Класс может содержать внутри себя собственные определяющие этот класс
переменные, называемые свойствами класса. Кроме того, класс, как правило,
содержит функции, которые называются методами класса. Для разграничения
методов и свойств следует запомнить, что методы ассоциируются с глаголами в
нашем обыденном языке, а свойства - с прилагательными или существительными. Тем
самым метод всегда подразумевает действие, а свойство - признак объекта.
К примеру, возьмем такой объект, как шариковая ручка. Его свойствами могут
являться слова "пластмассовая", "синяя", "новая" и так далее. А методом будет
лишь то, что она пишет (конечно, если вы не найдете другой способ ее
применения).
Доступ к свойствам и методам класса достигается с помощью указания пути к
нему, где первым его элементом является название класса, а вторым - название
самого свойства или метода. Элементы пути разделяются знаком ->. Давайте
рассмотрим, как это делается:
class Array_class { var $array = array(); // Определение свойства function getUniqSum() { // Получает сумму уникальных элементов
return array_sum(array_unique($this->array));
}
function getSortedMerge() { /* Возвращает отсортированный массив из
ключей и элементов массива */
$result = array_merge(array_keys($this->array), array_values($this->array));
sort($result);
return $result;
} } |
Вот мы написали небольшой класс работы с массивами. Он имеет одно свойство -
$array. Обратите внимание, как мы прописываем к нему путь: как уже
говорилось, первым элементом пути должно быть название класса, но ввиду того,
что это свойство и так находится в самом классе, то название меняется на слово
this.
Далее мы определяем два метода класса, представляющие собой функции
getUniqSum() и getSortedMerge(). Обратите внимание, что
свойства классов всегда являются глобальным в пределах этого класса, то есть нам
не требовалось в каждой функции писать global $this->array. Также
заметьте, где ставится знак $: его место в самом начале описания пути. Причем он
ставится даже перед указанием пути к методу класса (то есть фактически к
функции).
Теперь создадим новый класс, который будет наследовать все возможности
родительского класса.
class Advanced_array extends Array_class {
function advanced_array($size) { /* заполняет массив подряд
идущими числами, чередуя их знаки */
$z = 1;
for ($i = 0; $i < $size; $i++) {
$this->array[$i] = $i *$z;
$z = - $z;
}
}
function getSizeofMerge() { /* возвращает число
неповторяющихся элементов массива, полученного getSortedMerge() */
$merge = $this->getSortedMerge();
return sizeof(array_unique($merge));
}
} |
Обратите внимание на функцию с названием самого класса. Это так называемый
конструктор класса, который автоматически вызовется при создании
экземпляра класса.
Теперь рассмотрим ход работы с полученными классами.
$my = new Array_class; $my->array = array(1, 2, 6, 1); echo
$my->getUniqSum(); $my = new Advanced_array(4); echo
$my->getSizeofMerge(); |
Сначала мы создаем новый экземпляр класса Array_class и определяем
его свойство array, затем выводим сумму элементов без учета
повторяющихся (в нашем примере выведется 9). Далее мы создаем экземпляр класса
Advanced_array, который наследует все свойства и методы
Array_class.
Обратите внимание, что при создании класса не требуется указывать никаких
параметров, но так как у Advanced_array есть конструктор, требующий
параметры, то в скобках мы указываем эти данные.
Таким образом не пришлось определять свойство класса Advanced_array,
так как за нас это сделал конструктор. Затем мы применяем метод
getSizeofMerge(), который сам по себе использует метод родителя
getSortedMerge(), и выводим полученные данные.
Использование классов.
По правде говоря, PHP не является в полной мере объектно-ориентированным
языком, поэтому очень часто можно обойтись и без использования классов, но
иногда они сильно облегчают жизнь.
Но не стоит и злоупотреблять ими, так как неоправданно большое количество
используемых классов не только затрудняет понимание кода программы, но нередко
приводит к снижению ее производительности.
А на сегодня все. До встречи.
|