Статьи

Объектно-ориентированный PHP с классами и объектами

В этой статье мы собираемся исследовать основы объектно-ориентированного программирования на PHP. Мы начнем с введения в классы и объекты и обсудим пару продвинутых понятий, таких как наследование и полиморфизм, во второй половине этой статьи.

Объектно-ориентированное программирование, обычно называемое ООП, — это подход, который помогает вам разрабатывать сложные приложения так, чтобы их можно было легко поддерживать и масштабировать в течение длительного времени. В мире ООП реальные объекты, такие как Person , Car или Animal , рассматриваются как объекты. В объектно-ориентированном программировании вы взаимодействуете с вашим приложением, используя объекты. Это контрастирует с процедурным программированием, где вы в первую очередь взаимодействуете с функциями и глобальными переменными.

В ООП существует понятие « класс », которое используется для моделирования или сопоставления реальной сущности с шаблоном данных ( свойств ) и функциональных возможностей ( методов ). « Объект » — это экземпляр класса, и вы можете создать несколько экземпляров одного и того же класса. Например, существует один класс Person , но многие объекты person могут быть экземплярами этого класса — dan , zainab , hector и т. Д.

Класс определяет свойства. Например, для класса Person у нас могут быть name , age и номер phoneNumber . Тогда у каждого объекта персонажа будут свои значения для этих свойств.

Вы также можете определить методы в классе, которые позволяют вам манипулировать значениями свойств объекта и выполнять операции над объектами. В качестве примера вы можете определить метод save который сохраняет информацию об объекте в базе данных.

Класс — это шаблон, который представляет сущность реального мира и определяет свойства и методы сущности. В этом разделе мы обсудим базовую анатомию типичного класса 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 . Затем мы объявляем свойства, конструктор и другие методы класса.

Вы можете думать о свойствах класса как о переменных, которые используются для хранения информации об объекте. В приведенном выше примере мы определили три свойства first_name , last_name и age . В большинстве случаев доступ к свойствам класса осуществляется через созданные объекты.

Эти свойства являются private , что означает, что к ним можно получить доступ только из класса. Это самый безопасный уровень доступа к свойствам. Мы обсудим различные уровни доступа к свойствам и методам класса позже в этой статье.

Конструктор — это специальный метод класса, который вызывается автоматически при создании экземпляра объекта. Мы увидим, как создавать экземпляры объектов в следующих нескольких разделах, но сейчас вам просто нужно знать, что конструктор используется для инициализации свойств объекта при создании объекта.

Вы можете определить конструктор, определив метод __construct .

Мы можем думать о методах класса как о функциях, которые выполняют определенные действия, связанные с объектами. В большинстве случаев они используются для доступа и управления свойствами объекта и выполнения связанных операций.

В приведенном выше примере мы определили метод getLastName , который возвращает фамилию, связанную с объектом.

Итак, это краткое введение в структуру классов в PHP. В следующем разделе мы увидим, как создавать экземпляры объектов класса Employee .

В предыдущем разделе мы обсудили базовую структуру класса в 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 с тестами
    Паткос Чаба
  • PHP
    PHP Design Patterns
    Джереми МакПик

Объектно-ориентированное программирование является важным аспектом в разработке приложений, независимо от технологии, с которой вы работаете. Сегодня, в контексте PHP, мы обсудили несколько основных концепций ООП, и мы также воспользовались возможностью, чтобы представить несколько реальных примеров.

Не стесняйтесь размещать свои запросы, используя канал ниже!