PHP: Классы
Автор: | Артемьев Сергей Игоревич |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Класс - это одно из ключевых понятий так называемого "объектно-ориентированного программирования". Тема ООП достаточно сложна для понимания, но её освоение даст вам в руки мощнейший инструмент для создания и совершентвования своих скриптов. Мы не будем вдаваться в дебри теории, а рассмотрим только самое необходимое.
Класс можно представить как формальное описание некоего объекта, у которого есть свойства и методы. Свойство - это какое-то значение, ассоциированное с классом, а метод - функция, принадлежащая классу. Простой пример класса - "человек". Свойствами этого класса будет "цвет волос", "рост", "вес" и т.д., а методами - "спать", "есть", "ходить" и т.п.
Для того, чтобы воспользоваться классом, необходимо создать его экземпляр. Экземпляр класса - это реальный объект, для которого выделена память и установлены значения всех свойств. Для класса "человек" экземпляром будет конкретный индивид со своим цветом волос, ростом, весом и номером паспорта.
Одно из преимуществ объектного подхода при разработке систем - возможность скрытия особенностей реализации отдельных методов. Например, класс "человек" реализует метод "ходить", который выполняет перемещение экземпляра куда-либо. При этом нам совершенно не важно, как будет произведено перемещение: на ногах, на костылях или стоя на руках. Главное - мы знаем, что после вызова метода "ходить" экземпляр переместится куда скажем.
Рассмотрим другой пример - графические фигуры. Например:
<?php // объявляем класс с именем Rectangle class Rectangle { // свойство "ширина" private $width; // свойство "высота" private $height; // конструктор класса public function __construct($x, $y) { $this->width = $x; $this->height = $y; } // метод "посчитать площадь" public function Square() { return $this->width * $this->height; } } // создаём массив прямоугольников $rects = array(); // заполняем массив экземплярами $rects['1'] = new Rectangle(100, 100); $rects['2'] = new Rectangle(20, 200); $rects['3'] = new Rectangle(300, 50); // выводим площадь каждого экземпляра foreach($rects as $key => $rect) { echo 'Площадь ' . $key . ' прямоугольника: ' . $rect->Square() . ">br />\n"; } ?>
Объявление класса начинается с ключевого слова "class", после которого записывается имя класса. Тело класса (все свойства и методы) ограничиваются фигурными скобками "{}". Объявление любого свойства или метода начинается с ключевых слов public или private, определяющих область видимости свойства или метода. Элементы, помеченные "public" (публичные) видны извне класса, а помеченные "private" (частные) можно использовать только внутри этого же класса. Например:
<?php // создаём экземпляр класса $rect = new Rectangle(100, 100); // вызов публичного метода echo $rect->Square(); // попытка ображения к закрытому // свойству вызовет ошибку echo $rect->width; ?>
Свойства класса объявляются как обычные переменные (см. переменные $width и $height), а методы класса - как обычные функции. Основное отличие в том, что внутри метода непосредственно доступны все свойства и методы данного класса, т.е. нет необходимости пользоваться конструкцией global. Для указания того, что вы хотите обратиться к методу или свойству текущего экземпляра надо воспользоваться ссылкой $this, которая автоматически доступна внутри экземпляра любого класса (см. код метода Square() ).
Экземпляр класса создаётся при помощи ключевого слова "new" и имени класса. Конструкцию
<?php $rect = new Rectangle(100, 100); ?>
следует читать как "Создать экземпляр класса Rectangle с высотой 100, шириной 100, ссылку на экземпляр поместить в переменную $rect". В момент создания класса автоматически выполняется служебный метод, т.н. "конструктор". Он имеет фиксированное имя "__construct()", а тип и количество параметров определяет разработчик. Основное назначение конструктора - инициализация внутренних переменных и свойств класса. Единственное отличие конструктора от обычного метода - конструктор не может возвращать значение. Пример:
<?php // объявили класс с конструктором class DemoClass { private $a; private $b; private $c; private $d; public function __construct($a, $b, $c) { $this->a = $a; $this->b = $b; $this->c = $c; $this->d = 'my secret string'; } public function getSecret() { return $this->d; } } // создаём экземпляр класса $demo = new DemoClass('a', 'b', 'c'); // выводим секретную строку echo $demo->getSecret(); // строка 'my secret string' выводится, // хотя мы её явно не инициализировали ?>
Экземпляры классов удаляются так же, как все переменные PHP - посредством вызова unset(). При удалении экземпляра автоматически вызывается его деструктор. Это служебный метод без параметров с именем "__destruct()", в котором программист может явно закрыть и освободить все ресурсы, используемые экземпляром. По умолчанию, все ресурсы гарантированно освобождаются по окончании выполнения скрипта.
ООП - интересная область PHP, но изучать её в отрыве от практики очень сложно. Поэтому сейчас мы не будем вдаваться в тонкости и подробности, а рассмотрим их позже при решении практических задач.