6.7. Статические элементы класса
Статические элементы класса отличаются от обычных элементов класса и имеют отношение к самому классу, а не к экземплярам его объекта. Они используются для реализации функциональности и данных, которые должен содержать класс, но не принадлежат ни одному конкретному объекту. Как и в случае с обычными элементами классов, существуют как статические методы, так и статические свойства.
Статические свойства содержат данные, инкапсулируемые в класс, которые разделяются между всеми экземплярами класса. В частности, статические свойства класса очень похожи на глобальные переменные за исключением того, что они принадлежат определенному классу и могут иметь ограничение по доступу.
В листинге 6.3 уже приводилось статическое свойство Counter::$count, которое принадлежит классу Counter и не может принадлежать любому экземпляру класса Counter. При обращении к нему нельзя пользоваться методом this, но можно поль­зоваться методом self или любым другим допустимым выражением определения пространства имен. В листинге 6.3 метод getCount возвращает self::$count, но вместо него можно использовать Counter::$count.
Статические методы реализуют функциональность, которая будет инкапсулирована в класс, но не будет иметь отношения ни к одному конкретному объекту. Во многом подобно тому, как статические свойства аналогичны глобальным переменным, статические методы аналогичны глобальным функциям. Независимо от ограничений доступа статические методы имеют полный доступ к свойствам класса, к которому они принадлежат, и к экземплярам этого класса.
В листинге 6.3 метод getCount является обычным методом, который вызывается оператором ->. PHP создает переменную this, хотя тело метода им воспользоваться не может. Однако, во многом подобно тому, как это делает сам count, метод getCount не принадлежит ни к одному конкретному объекту. В определенных ситуациях они могут потребоваться и без указания экземпляра объекта, и в таком случае очень хорошо подходят статические методы. Язык PHP не создает this внутри статических методов, даже если они были вызваны из объекта.
Листинг 6.7 отличается от листинга 6.3 тем, что в нем getCount является статическим методом. Ключевое слово static не предотвращает вызова getCount из экземпляра с помощью оператора ->, но PHP не создает this внутри такого метода. Пользуясь соответствующим синтаксисом, можно попытаться статически вызвать любой метод. Если метод использует this, PHP генерирует ошибку.
Метод можно создать таким образом, чтобы он работал по-разному в зависимости от того, был он вызван статически или нет. Для этого необходимо протестировать установку this. Конечно, при использовании ключевого слова static метод всегда будет статическим, независимо от того, как он был вызван.
Классы также могут задавать постоянные свойства. Вместо использования конструкции public static для этих целей используется ключевое слово const. Ссылаться на постоянные свойства можно только статически. Это свойства класса, а не объекты, являющиеся экземплярами класса.

Листинг 6.7. Статические элементы

<?php
class Counter {
private static $count = 0; const VERSION = 2.0; function __construct()
self::$count++; function __destruct()
self::$count-- ; static function getCount()
return self::$count;
};
//создать один экземпляр $c = new Counter(); //печатать 1
print(Counter::getCount() . "<br>n"); // распечатать версию класса
print("Используется версия: " . Counter::VERSION . br>n"); ?>