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, но изучать её в отрыве от практики очень сложно. Поэтому сейчас мы не будем вдаваться в тонкости и подробности, а рассмотрим их позже при решении практических задач.
