Для того, чтобы обращаться к функциям и переменным внутри класса, нам необходимо знать данную переменную:
$this
Эта пеменная позволяет обращаться из одной функции внутри класса к другой, а так же к переменным этого класса. Как оно работает? Смотрим:
Итак, шаг первый. Создаём экземпляр класса:
Шаг второй. Обращаемся к нашему классу. Поскольку интересующая нас операция находится в функции anotherFunction(), то обратимся напрямую к ней:
Можно подумать, что на этом наша эпопея закончилась, ан нет, не так-то всё и просто. Заметили подвох в коде?
Интересующая нас функция — приватная. Честно говоря, сам не помню, рассказывал ли я это или нет. По-моему, очень бегло что-то выпалил на этот счет и понёсся дальше. Вернемся к тому моменту и рассмотрим поближе этот важный аспект. Ключевые слова public, protectedи privateуказывают на видимость функции или переменной для текущего исполняемого скрипта. Данные ключевые слова используются только в классах и интерфейсах. (Второе слово — страшное, рекомендую его не запоминать, а при наличии особого желании можно и загуглить).
Рассмотрим различия:
Таблица ключевых слов видимости
Параметр: Ключевое слово ->
Public
Protected
Private
Можно вызывать вне класса, обращаясь напрямую
Можно
Нельзя
Нельзя
Можно вызывать при клонировании модели класса из класса-клона (рассмотрим позднее)
Можно
Можно
Нельзя
Можно вызывать исключительно из оригинальной модели класса(т.е. из класса, где эта функция/переменная расположена)
Можно
Можно
Можно
Как вы видите, наш случай — первый (обращаемся к функции внекласса). Смотрим по таблице: функция приватная, ага, обращаться напрямую нельзя. Но ведь у нас есть функция someFunction, которая находится прямо в классе (третий случай в таблице), видим, что можно теперь все дороги открыты и можем со спокойной совестью к этой функции обращаться, если будем задействовать для этого функцию someFunction. Попробуем так сделать:
Что же при этом произойдет?
Пройдя все эти шаги, PHP в итоге доберется до вывода фразы «ОК», которую мы и увидим на экране. Можете попробовать сами, вот код:
class MyClass {
public function someFunction() {
$this->anotherFunction();
}
private function anotherFunction() {
print 'OK';
}
}
$class = new MyClass();
$class->someFunction();
Так, с областью видимости разобрались, кажется. Теперь попробуем разобраться с переменными. К переменным применим тот же самый принцип, что и к функциям. Однако существуют некоторые нюансы, которые нужно знать, работая с переменными. Рассмотрим типичный пример реализации переменных в классе:
Вот такой вот пример. Хочу обратить ваше внимание на деталь, которую нельзя упускать:
Видите, какое странное обращение к переменным? Мы не указываем символ доллара при обращении к переменным, но хотя когда объявляем их — ставить символы доллара обязательно.
Обратите внимание: при обращении к переменным внутри объекта использовать символы доллара запрещено, однако они необходимы при объявлении этих переменных.
Что же мы получим на экране в результате выполнения этого скрипта?
А получим мы значения всех трёх переменных. Почему? Обратимся к нашей таблице. Случай, который нас интересует — третий по счету. Значит, мы можем обращаться ко всем переменным и даже не смотреть на их тип видимости. А теперь обратимся к ним, находясь вне класса: