Ключевое слово $this в php
В PHP ключевое слово $this ссылается на текущий объект класса. Ключевое слово $this позволяет получить доступ к свойствам и методам текущего объекта внутри класса с помощью оператора объекта (->):
Ключевое слово $this доступно только внутри класса. Его не существует вне класса. Если вы попытаетесь использовать $this вне класса, вы получите сообщение об ошибке.
Когда Вы обращаетесь к свойству объекта с помощью ключевого слова $this, вы используете $ только с ключевым словом this. И вы не используете $ с именем свойства. Например:
Ниже показан класс BankAccount:
В этом примере мы получаем доступ к свойству balance с помощью ключевого слова $this внутри методов deposit() и takew().
Методы связывания
Для начала создим новый объект BankAccount:
Далее трижды вызовите метод deposit (), чтобы внести разные суммы денег:
Этот код довольно подробный. Было бы более кратко и выразительно, если бы вы могли написать эти утверждения, используя один оператор, подобный этому:
Этот способ называется объединением методов. Чтобы сформировать цепочку методов, метод deposit() должен вернуть объект BankAccount, который является $this внутри класса BankAccount следующим образом:
Метод deposit () возвращает $this, который является текущим объектом класса BankAccount. Следовательно, вы можете вызвать любой общедоступный метод класса BankAccount.
В следующем примере сначала вызывается метод deposit(), а затем метод remove() в одной инструкции:
Объектно-ориентированное программирование
При создании программы на PHP и отдельных ее блоков нам вполне может хватить той функциональности, которую представляют функции. Однако PHP имеет и другие возможности по созданию программ, которые представляет объектно-ориентированное программирование. В ряде случаев программы, использующие ООП, проще в понимании, их легче поддерживать и изменять.
Ключевыми понятиями парадигмы ООП являются понятия «класс» и «объект». Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека — этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является объектом или экземпляром этого класса.
Для создания класса в PHP используется ключевое слово class , после которого идет название класса и фигурные скобки <> — блок кода класса. Например, новый класс, представляющий пользователя:
Чтобы создать объект класса Person, применяется ключевое слово new :
В данном случае переменная $person является объектом класса Person . С помощью функции print_r() можно вывести содержимое объекта, как и в случае с массивами.
При этом неважно, определяется класс до или после создания объекта. Например, мы можем сначала определить переменную класса, а потом определить этот класс:
Свойства и методы
Класс может содержать переменные, которые описывают какие-то признаки объекта, его состояние и которые еще назывют свойствами или атрибутам. И также класс класс может содержать функции, которые еще назвают методами и которые определяют его поведение.
Так, добавим в класс Person несколько свойств и методов:
Здесь класс Person содержит два свойства: $name и $age . Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа — в данном случае модификатор public .
Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция hello() просто выводит приветствие.
После создания объекта класса Person:
Мы можем через имя переменной класса обращаться к его свойствам и методам. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа -> . Например, установить значения свойств:
Или получить значение (например, присвоить его переменной):
Или вызвать методы объекта:
В итоге мы получим следующий вывод браузера:
При этом свойствам можно задать в классе некоторые начальные значения:
Ключевое слово this
Для обращения к свойствам и методам объекта внутри его класса применяется ключевое слово this . Например, определим в классе метод для вывода информации об объекте:
Для обращения к полям и методам внутри класса также применяется оператор доступа -> , перед которым идет $this . Причем это $this указывает именно на текущий объект. Что это значит в практическом плане? Например:
$this фактически будет указывать на переменную $tom . Тогда как при вызове
$this будет указывать на переменную $bob .
Сравнение объектов
При сравнении объектов классов следует принимать во внимание ряд особенностей. В частности, при использовании оператора равенства == два объекта считаются равными, если они представляют один и тот же класс и их свойства имеют одинаковые значения.
А при использовании оператора эквивалентности === оба объекта считаются равными, если обе переменных классах указывают на один и тот же экземпляр класса.
Рассмотрим на примере:
Здесь сравниваются две переменных — $tom и $tomas. Они представляют один и тот же класс Person, и их свойства имеют одни и те же значения. Однако они представляют разные объекты. Поэтому при сравнении оператор == возвратит true , а оператор === — false :
Возьмем другой пример, когда обе переменных представляют один и тот же объект:
Здесь объект класса Person создается только один раз: $person = new Person(); . И затем обе переменных $tom и $tomas будут указывать на этот объект. При этом не имеет значения, для какой именно переменной мы устанавливаем свойства. Так как в реальности это будет один и тот же объект. В итоге и оператор == , и оператор === при сравнении возвратят true
Обращение к методам класса через $this
Через $this можно обращаться не только к свойствам объекта, но и к его методам. Посмотрим на примере. Пусть у нас есть класс User , а в нем метод setAge для изменения возраста юзера:
Давайте добавим проверку введенного возраста: если он от 18 до 60 , то будем менять возраст на новый, а если нет — то менять не будем:
Пусть также нам нужен метод addAge , который будет добавлять некоторое количество лет к текущему возрасту:
В метод addAge , конечно же, также необходимо добавить проверку возраста, сделаем это:
Получится, что ограничения на возраст теперь задаются в двух местах (в методе setAge и в методе addAge ), что не очень хорошо: если мы захотим поменять ограничение, нам придется сделать это в двух местах — это неудобно, и в каком-то из мест мы можем забыть внести изменения — это опасно, ведь наш код получится с трудноуловимой ошибкой.
Давайте вынесем проверку возраста на корректность в отдельный вспомогательный метод isAgeCorrect , в который параметром будет передаваться возраст для проверки, и используем его внутри методов setAge и addAge :
Теперь любое изменения в условиях проверки можно будет легко сделать в одном месте. Проверим, что все работает как надо:
Не подсматривая в мой код создайте такой же класс User с такими же методами.
Создайте объект этого класса User проверьте работу методов setAge и addAge .
Добавьте также метод subAge , который будет выполнять уменьшение текущего возраста на переданное количество лет.
Классы и объекты в PHP
Класс — это шаблон для объектов, а объект — это экземпляр класса.
Представьте, что у нас есть класс Car . Car может иметь такие свойства, как название, цвет, диски и т.д. Мы можем определить переменные класса например, $name , $color и $disk для хранения значений этих свойств.
Если мы создадим отдельные объекты (BMW, Mercedes Benz и т.д.), то они будут наследовать все свойства и поведение класса Car , но каждый объект будет иметь разные значения свойств.
Что такое класс PHP?
Класс определяется с помощью ключевого слова class , за которым следует имя класса и пара фигурных скобок (<>). Все его свойства и методы заключены в фигурные скобки:
Синтаксис
Ключевое слово class используется для определения класса в PHP. Ниже приведены правила создания класса в PHP:
- Пишем название класса с большой буквы.
- Если имя класса содержит более одного слова, мы пишем каждое слово с большой буквы. Это известный стиль верблюда. Например, JapaneseCars, AmericanIdol, EuropeTour и др.
- Имя класса не может быть зарезервированным словом PHP.
- Имя класса не может содержать пробелов.
Как добавить свойства к классу?
Мы вызываем свойства внутри класса. Свойства могут принимать такие значения, как строки, целые числа и логические значения (true/false), как и любые другие переменные. Добавим несколько свойств в класс Car:
Приведем правила создания свойств к классу:
- Мы используем ключевое слово public перед свойством класса.
- Согласно соглашению об именах, имя свойства начинается со строчной буквы.
- Если имя содержит более одного слова, все слова, кроме первого слова, начинаются с заглавной буквы. Например, $color или $hasSunRoof (Верблюжий регистр camelCase).
- Свойство может иметь значение по умолчанию. Например, $color = ‘green’.
- Мы также можем создать свойство без значения по умолчанию. Например, $name.
Объявим класс с именем Car , который будет состоять из двух свойств ( $name и $color ) и двух методов set_name() и get_name() для установки и получения свойства $name :
Пример
Данный код ничего не выведет, поскольку мы создали класс, но не создали пока ни одного объекта.
Примечание: В классе переменные называются свойствами, а функции — методами!
Что такое объект PHP?
Объект — это экземпляр класса. Из класса мы можем создать столько объектов, сколько может понадобиться для проекта. Каждый объект имеет все свойства и методы, определенные в классе, но у них будут разные значения свойств.
Для объявления объекта необходимо использовать ключевое слово new .
Далее создадим из класса Car два объекта — $bmw и $mercedes .
Процесс создания объекта также известен как создание экземпляра.
Объекты, для чего они нужны?
В то время как в процедурном стиле программирования все функции и переменные находятся вместе в глобальной области видимости таким образом, чтобы их можно было использовать, просто вызывая их имя, использование классов делает манипуляции с кодом внутри классов скрытыми от глобальной области. Это происходит потому, что код внутри классов инкапсулируется в пределах класса, вне досягаемости глобальной области. Итак, нам нужен способ, позволяющий коду из глобальной области видимости использовать код внутри класса, и этот способ базируется на создании объектов из класса.
Мы можем создать столько объектов, сколько захотим, из одного и того же класса, и все они будут совместно использовать методы и свойства класса. См. изображение ниже:
Из одного и того же класса Car мы создали три отдельных объекта с названиями: Mercedes , Bmw и Audi .
Хотя все объекты были созданы из одного и того же класса и, следовательно, имеют методы и свойства класса, они все же разные. Это не только потому, что они имеют разные названия, но и потому, что их свойствам могут быть присвоены разные значения. Например, на изображении выше они различаются свойством цвета: Mercedes зеленый, Bmw синий, а Audi оранжевый.
Примечание: Класс содержит методы и свойства, общие для всех созданных из него объектов.
Хотя объекты используют один и тот же код, они могут вести себя по-разному, поскольку им могут быть присвоены разные значения.
Как получить свойства объекта?
Создав объект, мы можем получить его свойства. Например:
Когда объект создан, мы можем получить доступ к свойствам класса с помощью оператора (->) .
Обратите внимание, что имя свойства не начинается со знака $ ; только имя объекта начинается с символа $ .
Пример
Результат выполнения кода:
Свойство color было установлено в классе по умолчанию (green), поэтому все объекты его унаследовали.
Как установить свойства объекту?
Чтобы установить свойство объектe, мы используем аналогичный подход.
Например, установим синий цвет объекту bmw :
Таким же способом установим значение свойства $name для обоих объектов:
Установив значение свойства, мы можем получить его значение. Чтобы получить цвет объекта $bmw , мы используем следующую строку кода: