Объектно-ориентированное программирование
При создании программы на PHP и отдельных ее блоков нам вполне может хватить той функциональности, которую представляют функции. Однако PHP имеет и другие возможности по созданию программ, которые представляет объектно-ориентированное программирование. В ряде случаев программы, использующие ООП, проще в понимании, их легче поддерживать и изменять.
Ключевыми понятиями парадигмы ООП являются понятия «класс» и «объект». Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: например, у каждого человека есть имя, определенный возраст, вес, какие-то другие параметры. То есть некоторый шаблон, который содержит набор параметров человека — этот шаблон можно назвать классом. А реально же существующий человек с конкретным именем, возрастом, весом и т.д. является объектом или экземпляром этого класса.
Для создания класса в PHP используется ключевое слово class , после которого идет название класса и фигурные скобки <> — блок кода класса. Например, новый класс, представляющий пользователя:
Чтобы создать объект класса Person, применяется ключевое слово new :
$person = new Person(); print_r($person); ?>
В данном случае переменная $person является объектом класса Person . С помощью функции print_r() можно вывести содержимое объекта, как и в случае с массивами.
При этом неважно, определяется класс до или после создания объекта. Например, мы можем сначала определить переменную класса, а потом определить этот класс:
Свойства и методы
Класс может содержать переменные, которые описывают какие-то признаки объекта, его состояние и которые еще назывют свойствами или атрибутам. И также класс класс может содержать функции, которые еще назвают методами и которые определяют его поведение.
Так, добавим в класс Person несколько свойств и методов:
"; > > $tom = new Person(); $tom->name = "Tom"; // установка свойства $name $tom->age = 36; // установка свойства $age $personName = $tom->name; // получение значения свойства $name echo "Имя пользователя: " . $personName . "
"; $tom->hello(); // вызов метода hello() print_r($tom); ?>
Здесь класс Person содержит два свойства: $name и $age . Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа — в данном случае модификатор public .
Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция hello() просто выводит приветствие.
После создания объекта класса Person:
Мы можем через имя переменной класса обращаться к его свойствам и методам. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа -> . Например, установить значения свойств:
$tom->name = "Tom"; // установка свойства $name $tom->age = 36; // установка свойства $age
Или получить значение (например, присвоить его переменной):
$personName = $tom->name; // получение значения свойства $name
Или вызвать методы объекта:
$tom->hello(); // вызов метода hello()
В итоге мы получим следующий вывод браузера:
Имя пользователя: Tom Hello! Person Object ( [name] => Tom [age] => 36 )
При этом свойствам можно задать в классе некоторые начальные значения:
"; > > $tom = new Person(); $tom->age = 36; // установка свойства $age echo "Имя пользователя: " . $tom->name . "
"; echo "Возраст пользователя: " . $tom->age . "
"; ?>
Имя пользователя: Undefined Возраст пользователя: 36
Ключевое слово this
Для обращения к свойствам и методам объекта внутри его класса применяется ключевое слово this . Например, определим в классе метод для вывода информации об объекте:
name ."; Age: " . $this->age . "
"; // также можно написать // echo "Name: $this->name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> displayInfo(); // Name: Tom; Age: 18 ?>
Для обращения к полям и методам внутри класса также применяется оператор доступа -> , перед которым идет $this . Причем это $this указывает именно на текущий объект. Что это значит в практическом плане? Например:
name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> displayInfo(); $bob = new Person(); $bob -> name = "Bob"; $bob -> age = 25; $bob -> displayInfo(); ?>
$this фактически будет указывать на переменную $tom . Тогда как при вызове
$this будет указывать на переменную $bob .
Name: Tom; Age: 18 Name: Bob; Age: 25
Сравнение объектов
При сравнении объектов классов следует принимать во внимание ряд особенностей. В частности, при использовании оператора равенства == два объекта считаются равными, если они представляют один и тот же класс и их свойства имеют одинаковые значения.
А при использовании оператора эквивалентности === оба объекта считаются равными, если обе переменных классах указывают на один и тот же экземпляр класса.
name; Age: $this->age
"; > > $tom = new Person(); $tom -> name = "Tom"; $tom -> age = 36; $tomas = new Person(); $tomas -> name = "Tom"; $tomas -> age = 36; if($tom == $tomas) echo "переменные tom и tomas равны
"; else echo "переменные tom и tomas НЕ равны
"; if($tom === $tomas) echo "переменные tom и tomas эквивалентны"; else echo "переменные tom и tomas НЕ эквивалентны"; ?>
Здесь сравниваются две переменных — $tom и $tomas. Они представляют один и тот же класс Person, и их свойства имеют одни и те же значения. Однако они представляют разные объекты. Поэтому при сравнении оператор == возвратит true , а оператор === — false :
переменные tom и tomas равны переменные tom и tomas НЕ эквивалентны
Возьмем другой пример, когда обе переменных представляют один и тот же объект:
$person = new Person(); $tom = $person; $tom -> name = "Tom"; $tom -> age = 36; $tomas = $person; if($tom == $tomas) echo "переменные tom и tomas равны
"; else echo "переменные tom и tomas НЕ равны
"; if($tom === $tomas) echo "переменные tom и tomas эквивалентны"; else echo "переменные tom и tomas НЕ эквивалентны";
Здесь объект класса Person создается только один раз: $person = new Person(); . И затем обе переменных $tom и $tomas будут указывать на этот объект. При этом не имеет значения, для какой именно переменной мы устанавливаем свойства. Так как в реальности это будет один и тот же объект. В итоге и оператор == , и оператор === при сравнении возвратят true
переменные tom и tomas равны переменные tom и tomas эквивалентны
Объектно-ориентированный PHP с классами и объектами
Sajal Soni Last updated Dec 4, 2018
В этой статье мы исследуем основы объектно-ориентированного программирования на PHP. Начнем с введения в классы и объекты, а во второй половине статьи обсудим несколько продвинутых понятий, таких как наследование и полиморфизм.
Что такое объектно-ориентированное программирование (ООП)?
Объектно-ориентированное программирование, обычно называемое ООП — это подход, который вам помогает разрабатывать сложные приложения таким образом, чтобы они легко поддерживались и масштабировались в течение длительного времени. В мире ООП реальные понятия Person , Car или Animal рассматриваются как объекты. В объектно-ориентированном программировании вы взаимодействуете с вашим приложением, используя объекты. Это отличается от процедурного программирования, когда вы, в первую очередь, взаимодействуете с функциями и глобальными переменными.
В ООП существует понятие «class», использываемое для моделирования или сопоставления реального понятия с шаблоном данных (свойств) и функциональных возможностей (методов). «Оbject» — это экземпляр класса, и вы можете создать несколько экземпляров одного и того же класса. Например, существует один класс Person , но многие объекты person могут быть экземплярами этого класса — dan , zainab , hector и т. д.
Например, для класса Person могут быть name , age и phoneNumber . Тогда у каждого объекта person для этих свойств будут свои значения.
Вы также можете определить в классе методы, которые позволяют вам манипулировать значениями свойств объекта и выполнять операции над объектами. В качестве примера вы можете определить метод save , сохраняющий информацию об объекте в базе данных.
Что такое класс PHP?
Класс — это шаблон, который представляет реальное понятие и определяет свойства и методы данного понятия. В этом разделе мы обсудим базовую анатомию типичного класса PHP.
Лучший способ понять новые концепции — показать это на примере. Итак, давайте рассмотрим в коде класс Employee , который представляет объект служащего.