В этой статье мы собираемся исследовать основы объектно-ориентированного программирования на PHP. Мы начнем с введения в классы и объекты и обсудим пару продвинутых понятий, таких как наследование и полиморфизм, во второй половине этой статьи.
Что такое объектно-ориентированное программирование (ООП)?
Объектно-ориентированное программирование, обычно называемое ООП, — это подход, который помогает вам разрабатывать сложные приложения так, чтобы их можно было легко поддерживать и масштабировать в течение длительного времени. В мире ООП реальные объекты, такие как Person
, Car
или Animal
, рассматриваются как объекты. В объектно-ориентированном программировании вы взаимодействуете с вашим приложением, используя объекты. Это контрастирует с процедурным программированием, где вы в первую очередь взаимодействуете с функциями и глобальными переменными.
В ООП существует понятие « класс », которое используется для моделирования или сопоставления реальной сущности с шаблоном данных ( свойств ) и функциональных возможностей ( методов ). « Объект » — это экземпляр класса, и вы можете создать несколько экземпляров одного и того же класса. Например, существует один класс Person
, но многие объекты person могут быть экземплярами этого класса — dan
, zainab
, hector
и т. Д.
Класс определяет свойства. Например, для класса Person у нас могут быть name
, age
и номер phoneNumber
. Тогда у каждого объекта персонажа будут свои значения для этих свойств.
Вы также можете определить методы в классе, которые позволяют вам манипулировать значениями свойств объекта и выполнять операции над объектами. В качестве примера вы можете определить метод save
который сохраняет информацию об объекте в базе данных.
Что такое класс PHP?
Класс — это шаблон, который представляет сущность реального мира и определяет свойства и методы сущности. В этом разделе мы обсудим базовую анатомию типичного класса PHP.
Лучший способ понять новые концепции — это на примере. Итак, давайте посмотрим на класс Employee
в следующем фрагменте, который представляет сущность Employee
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?php
class Employee
{
private $first_name;
private $last_name;
private $age;
public function __construct($first_name, $last_name, $age)
{
$this->first_name = $first_name;
$this->last_name = $last_name;
$this->age = $age;
}
public function getFirstName()
{
return $this->first_name;
}
public function getLastName()
{
return $this->last_name;
}
public function getAge()
{
return $this->age;
}
}
?>
|
Оператор class Employee
в первой строке определяет класс Employee
. Затем мы объявляем свойства, конструктор и другие методы класса.
Свойства класса в PHP
Вы можете думать о свойствах класса как о переменных, которые используются для хранения информации об объекте. В приведенном выше примере мы определили три свойства — first_name
, last_name
и age
. В большинстве случаев доступ к свойствам класса осуществляется через созданные объекты.
Эти свойства являются private
, что означает, что к ним можно получить доступ только из класса. Это самый безопасный уровень доступа к свойствам. Мы обсудим различные уровни доступа к свойствам и методам класса позже в этой статье.
Конструкторы для классов PHP
Конструктор — это специальный метод класса, который вызывается автоматически при создании экземпляра объекта. Мы увидим, как создавать экземпляры объектов в следующих нескольких разделах, но сейчас вам просто нужно знать, что конструктор используется для инициализации свойств объекта при создании объекта.
Вы можете определить конструктор, определив метод __construct
.
Методы для PHP классов
Мы можем думать о методах класса как о функциях, которые выполняют определенные действия, связанные с объектами. В большинстве случаев они используются для доступа и управления свойствами объекта и выполнения связанных операций.
В приведенном выше примере мы определили метод getLastName
, который возвращает фамилию, связанную с объектом.
Итак, это краткое введение в структуру классов в PHP. В следующем разделе мы увидим, как создавать экземпляры объектов класса Employee
.
Что такое объект в PHP?
В предыдущем разделе мы обсудили базовую структуру класса в PHP. Теперь, когда вы хотите использовать класс, вам нужно создать его экземпляр, и конечным результатом будет объект. Таким образом, мы можем рассматривать класс как план, а объект — это реальная вещь, с которой вы можете работать.
В контексте класса Employee
который мы только что создали в предыдущем разделе, давайте посмотрим, как создать экземпляр объекта этого класса.
1
2
3
4
5
6
7
|
<?php
$objEmployee = new Employee(‘Bob’, ‘Smith’, 30);
echo $objEmployee->getFirstName();
echo $objEmployee->getLastName();
echo $objEmployee->getAge();
?>
|
Вам нужно использовать ключевое слово new
когда вы хотите создать экземпляр объекта любого класса вместе с его именем, и вы получите новый экземпляр объекта этого класса.
Если класс определил метод __construct
и он требует аргументов, вам нужно передать эти аргументы при создании экземпляра объекта. В нашем случае конструктор класса Employee
требует три аргумента, и мы передали их, когда создали объект $objEmployee
. Как мы уже обсуждали ранее, метод __construct
вызывается автоматически при создании экземпляра объекта.
Затем мы вызвали методы класса для объекта $objEmployee
чтобы напечатать информацию, которая была инициализирована во время создания объекта. Конечно, вы можете создать несколько объектов одного класса, как показано в следующем фрагменте.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
$objEmployeeOne = new Employee(‘Bob’, ‘Smith’, 30);
echo $objEmployeeOne->getFirstName();
echo $objEmployeeOne->getLastName();
echo $objEmployeeOne->getAge();
$objEmployeeTwo = new Employee(‘John’, ‘Smith’, 34);
echo $objEmployeeTwo->getFirstName();
echo $objEmployeeTwo->getLastName();
echo $objEmployeeTwo->getAge();
?>
|
Следующее изображение представляет собой графическое представление класса Employee и некоторых его экземпляров.
Проще говоря, класс — это проект, который вы можете использовать для создания структурированных объектов.
Инкапсуляция
В предыдущем разделе мы обсуждали, как создавать экземпляры объектов класса Employee
. Интересно отметить, что $objEmployee
объект $objEmployee
объединяет свойства и методы класса. Другими словами, он скрывает эти детали от остальной части программы. В мире ООП это называется инкапсуляцией данных.
Инкапсуляция является важным аспектом ООП, который позволяет ограничить доступ к определенным свойствам или методам объекта. И это подводит нас к другой теме для обсуждения : уровень доступа.
Уровни доступа
Когда вы определяете свойство или метод в классе, вы можете объявить, что он имеет один из этих трех уровней доступа — public
, private
или protected
.
Публичный доступ
Когда вы объявляете свойство или метод как public, к нему можно получить доступ из любого места вне класса. Значение открытого свойства может быть изменено в любом месте вашего кода.
Давайте посмотрим на пример, чтобы понять уровень публичного доступа.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?php
class Person
{
public $name;
public function getName()
{
return $this->name;
}
}
$person = new Person();
$person->name = ‘Bob Smith’;
echo $person->getName();
?>
|
Как вы можете видеть в приведенном выше примере, мы объявили свойство name
как public. Следовательно, вы можете установить его из любого места вне класса, как мы сделали здесь.
Частный доступ
Когда вы объявляете свойство или метод как private
, к нему можно получить доступ только из класса. Это означает, что вам нужно определить методы получения и установки, чтобы получить и установить значение этого свойства.
Опять же, давайте пересмотрим предыдущий пример, чтобы понять уровень частного доступа.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
class Person
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
$person = new Person();
$person->name = ‘Bob Smith’;
$person->setName(‘Bob Smith’);
echo $person->getName();
?>
|
Если вы попытаетесь получить доступ к частному свойству извне класса, он выдаст фатальную ошибку. Cannot access private property Person::$name
Cannot access private property Person::$name
, Таким образом, вам нужно установить значение частного свойства с помощью метода setter, как мы это делали с setName
метода setName
.
Есть веские причины, по которым вы можете захотеть сделать собственность частной. Например, возможно, следует предпринять какое-то действие (скажем, обновить базу данных или перерисовать шаблон), если это свойство изменяется. В этом случае вы можете определить метод установки и обрабатывать любую специальную логику при изменении свойства.
Защищенный доступ
Наконец, когда вы объявляете свойство или метод protected
, к ним может обращаться тот же класс, который его определил, и классы, которые наследуют рассматриваемый класс. Мы обсудим наследование в следующем разделе, поэтому вернемся к уровню защищенного доступа чуть позже.
наследование
Наследование является важным аспектом парадигмы объектно-ориентированного программирования, которая позволяет вам наследовать свойства и методы других классов, расширяя их. Класс, который наследуется, называется родительским классом , а класс, который наследует другой класс, называется дочерним классом . Когда вы создаете экземпляр объекта дочернего класса, он также наследует свойства и методы родительского класса.
Давайте посмотрим на следующий снимок экрана, чтобы понять концепцию наследования.
В приведенном выше примере класс Person
является родительским классом, а класс Employee
расширяет или наследует класс Person и поэтому называется дочерним классом.
Давайте попробуем пройти реальный пример, чтобы понять, как он работает.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
<?php
class Person
{
protected $name;
protected $age;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
private function callToPrivateNameAndAge()
{
return «{$this->name} is {$this->age} years old.»;
}
protected function callToProtectedNameAndAge()
{
return «{$this->name} is {$this->age} years old.»;
}
}
class Employee extends Person
{
private $designation;
private $salary;
public function getAge()
{
return $this->age;
}
public function setAge($age)
{
$this->age = $age;
}
public function getDesignation()
{
return $this->designation;
}
public function setDesignation($designation)
{
$this->designation = $designation;
}
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
public function getNameAndAge()
{
return $this->callToProtectedNameAndAge();
}
}
$employee = new Employee();
$employee->setName(‘Bob Smith’);
$employee->setAge(30);
$employee->setDesignation(‘Software Engineer’);
$employee->setSalary(’30K’);
echo $employee->getName();
echo $employee->getAge();
echo $employee->getDesignation();
echo $employee->getSalary();
echo $employee->getNameAndAge();
echo $employee->callToPrivateNameAndAge();
?>
|
Здесь важно отметить, что класс Employee
использовал ключевое слово extends
для наследования класса Person
. Теперь класс Employee
может получить доступ ко всем свойствам и методам класса Person
, которые объявлены как открытые или защищенные. (Он не может получить доступ к членам, которые объявлены как частные.)
В приведенном выше примере объект $employee
может получить доступ к getName
и setName
, которые определены в классе Person
поскольку они объявлены как публичные.
Затем мы callToProtectedNameAndAge
методу callToProtectedNameAndAge
используя метод getNameAndAge
определенный в классе Employee
, поскольку он объявлен защищенным. Наконец, объект $employee
не может получить доступ к методу callToPrivateNameAndAge
класса Person
поскольку он объявлен как закрытый.
С другой стороны, вы можете использовать объект $employee
для установки свойства age
класса Person
, как мы это делали в методе setAge
который определен в классе Employee
, поскольку свойство age
объявлено как защищенное.
Так что это было краткое введение в наследство. Это помогает уменьшить дублирование кода и, следовательно, способствует повторному использованию кода.
Полиморфизм
Полиморфизм — еще одна важная концепция в мире объектно-ориентированного программирования, которая относится к способности обрабатывать объекты по-разному в зависимости от их типов данных.
Например, в контексте наследования, если дочерний класс хочет изменить поведение метода родительского класса, он может переопределить этот метод. Это называется переопределением метода. Давайте быстро рассмотрим пример из реальной жизни, чтобы понять концепцию переопределения метода.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
class Message
{
public function formatMessage($message)
{
return printf(«<i>%s</i>», $message);
}
}
class BoldMessage extends Message
{
public function formatMessage($message)
{
return printf(«<b>%s</b>», $message);
}
}
$message = new Message();
$message->formatMessage(‘Hello World’);
$message = new BoldMessage();
$message->formatMessage(‘Hello World’);
?>
|
Как видите, мы изменили поведение метода formatMessage
, переопределив его в классе BoldMessage
. Важно то, что сообщение форматируется по-разному в зависимости от типа объекта, будь то экземпляр родительского класса или дочернего класса.
(Некоторые объектно-ориентированные языки также имеют своего рода перегрузку методов, которая позволяет определять несколько методов класса с одним и тем же именем, но с разным количеством аргументов. Это не поддерживается напрямую в PHP, но есть несколько обходных путей для достижения аналогичных функциональность.)
Вывод
Объектно-ориентированное программирование является обширной темой, и мы лишь поверхностно рассмотрели его сложность. Я очень надеюсь, что это руководство помогло вам начать работу с основами ООП и побудило вас продолжить изучение более продвинутых тем ООП.
-
PHPОсновы PHP
-
PHPОсновы PHP объектно-ориентированного программирования
-
OOPООП в PHP с тестами
-
PHPPHP Design Patterns
Объектно-ориентированное программирование является важным аспектом в разработке приложений, независимо от технологии, с которой вы работаете. Сегодня, в контексте PHP, мы обсудили несколько основных концепций ООП, и мы также воспользовались возможностью, чтобы представить несколько реальных примеров.
Не стесняйтесь размещать свои запросы, используя канал ниже!