Давайте остановимся на одной интересной особенности РНР. Речь идет о том, что операторы:
$this->property = 101;
$obj->property = 303;
допустимы и не вызывают ошибку даже в случае, если свойство $property в классе не объявлено. В этом отношении объекты очень похожи на ассоциативные массивы: в них можно создавать произвольные ключи, а также возможно ограничить доступ к некоторым из них (например, с помощью модификатора private). Применим даже такой синтаксис:
$key = "test";
$obj->$key = 314;
При этом в объекте $obj создастся свойство с именем Stest и значением 314, а РНР даже "не пикнет", в том числе в режиме контроля ошибок E_ALL|E_STRICT.
Общие рекомендации
Есть несколько канонических советов, характерных для объектно-ориентированного подхода и любых языков программирования.
Вот некоторые из них:
· Скрывайте при помощи модификатора private как можно больше данных и методов. Оставляйте открытыми только те члены класса, которые действительно моrут пригодиться вызывающей программе.
· Не создавайте открытых методов "про запас". Если в будущем какой-то из них понадобится в вызывающей программе, всегда можно изменить его модификатор доступа. Помните: "открыть" метод всегда проще, чем "закрыть" его впоследствии (ибо, сменив модификатор метода с public на private, нам придется проверить все скрипты, которые используют наш класс).
· Группируйте открытые методы в начале класса, а закрытые - в его конце. Это поможет выделить интерфейс класса (методы, доступные извне).
· Старайтесь не создавать открытые свойства вообще. Делайте их закрытыми (private) или, в крайнем случае, - защищенными (protected). Доступ к свойствам лучше организовывать при помощи открытых методов - так можно, например, запретить изменение свойства, или выполнить некоторые действия перед его считыванием.
Класс - self, объект - $this
Классы выступают в качестве шаблонов для объектов. Для того чтобы обратиться к внутреннему содержимому объекта, используется ключевое слово Sthis. Для обращения к внутреннему содержимому класса используется ключевое слово self (рис. 1). Как видно, ключевое слово $this снабжено символом доллара, чтобы подчеркнуть связь с переменными. В то время как ключевое слово self обходится без символа доллара - это указание на то, что обращаемся мы не к переменной.
Рис. 1. self используется дм обращения к внутренним переменным и методам класса, а $this - к переменным и методам объекта
Особенностью статических членов и методов является тот факт, что они определяются не на уровне объекта, а на уровне класса.
Статическое свойство недоступно через обращение $this->property или $obj->property. Вместо этого используется оператор:: и либо имя класса (ИмяКласса:: $property), либо ключевое слово self {self:: $property).
Статический метод во время своего запуска не получает ссылку $this, поэтому он может работать только со статическими членами (свойствами и другими методами) своего класса.