Давайте рассмотрим пример класса, который "считает", сколько его экземпляров (объектов) существует в текущий момент, и позволяет получить эту информацию из вызывающей программы (листинг 1).
Листинг 1 Использование статических членов класса. Файл static.php
ВНИМАНИЕ!
Взгляните еще раз на конструктор класса: в нем мы используем команду self::$count++, а не $this->count++. Как уже говорилось выше, статическое свойство принадлежат не объекту, а самому классу, поэтому в $this, представляющем данные объекта, его попросту нет. Тем не менее обращение $this->count++ не порождает ошибку во время выполнения программы! Будьте внимательны.
Пример: кэш ресурсов
Выше мы рассматривали класс FileLogger, который позволяет добавлять сообщения в lоg-файлы. Однако, наверное, не очень хорошо создавать несколько объектов для одного и того же физического файла. Хотелось бы сделать так, чтобы при указании одинаковых имен файлов система не создавала новые объекты, а просто возвращала уже существующие. Такой подход называется кэшированием ресурса по идентификатору (в качестве ресурса тут выступает файл, а в качестве его идентификатора - имя файла). Пример - в листинге 2.
|
|
Листинг 2 Локальное кеширование ресурса. Файл cache.php
Заметив, что времена создания переменных совпадают, мы и убеждаемся, что в действительности $logger1 и $ logger2 - ссылки на один и тот же объект.
Обратите внимание, что для запрета прямого создания объектов FileLogger мы использовали закрытый конструктор. Это гарантирует, что массив FileLogger::$loggers будет всегда содержать актуальные значения, которые "не испортятся" в результате действий сторонней программы.
Константы класса
Наряду с членами классы могут содержать константы, которые определяются при помощи ключевого слова const. В листинге 3 приводится пример класса cls, включающего в свой состав константу NАМЕ, которая содержит имя класса.
Листинг 3. Использование констант к классах. Файл const.php
Точно так же, как и в случае со статическими членами классов, к константам нельзя обращаться при помощи оператора->; для обращения используется оператор разрешения области видимости:: который предваряется либо именем класса. либо ключевым словом self.
Существование констант может быть проверено при помощи функции defined(), которая возвращает true, если константа существует, и false в противном случае (листинг 4).
Листинг 3 Проверка существования констант класса. Файл defined.php
АМЕЧАННИЕ
При проверке классовых констант следует в обязательном порядке использовать оператор разрешения области видимости:: и имя класса.