Здравствуйте всем, это первая серия сериала “ООП здорового человека”. Есть 3 механизма, без которых ООП не ООП – это наследование, инкапсуляция и полиморфизм. Также, есть механизм “сокрытие”, который приписываю к части инкапсуляции.
Наследование
Наследование — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения. Эт-то о че нам говорит статья Википедии… я же предлагаю пока не рассматривать абстракцию(поскольку это не необходимое условие для данного механизма), а рассмотреть само явление наследования. Как и в жизни, наследник получает в свое распоряжение активы наследуемого; на примере класса Person из этой статьи:
<?php
class Person
{
public int $id;
public string $name;
public string $secondName;
public string $sex;
public string $birthday;
public function toArray()
{
return get_object_vars($this);
}
}допустим персона это частный случай каких-то единиц(персона наследует элемент)
<?php
class Item
{
public int $id;
public string $name;
public function toArray()
{
return get_object_vars($this);
}
}
class Person extends Item
{
public string $secondName;
public string $sex;
public string $birthday;
}При этом класс Person включает все методы и свойства класса Item
<?php
// классы ранее
print_r(get_class_methods('Person'));
print_r(get_class_vars('Person'));
// вывод
Array
(
[0] => toArray
)
Array
(
[secondName] =>
[sex] =>
[birthday] =>
[id] =>
[name] =>
)Однако, их(активы наследуемого класса) можно скрыть от наследника – об этом в следующей статье. Смысл наследования состоит в минимальном копи-пасте кода. В некоторых языках наследоваться можно от многих, в других же – от одного класса(пример PHP – там множественное наследование спародировано трейтами – об этом в следующих сериях).
Инкапсуляция
Инкапсуляция (англ. encapsulation, от лат. in capsula) — размещение в одном компоненте данных и методов, которые с ними работают. В реализации большинства языков программирования обеспечивает механизм сокрытия, позволяющий разграничивать доступ к различным компонентам программы. Этот принцип в классе Person сохранен, т.к. все методы класса работают с данными, лежащими в нем же.
Инкапсуляция считается неполной если не реализовано сокрытие. Сокрытие – запрет на прямой доступ к полям объекта, вместо этого – доступ через модификаторы. На примере класса Item это выглядит так
<?php
class Item
{
protected int $id;
protected string $name;
public function setId($id)
{
$this->id = (int) $id;
}
public function getId()
{
return $this->id;
}
public function setName($name)
{
$this->name = strval($name);
}
public function getName()
{
return $this->name;
}
public function toArray()
{
return get_object_vars($this);
}
}Для сокрытия модификатор (свойства) public заменяется на protected/private(о разнице также в следующих сериях) и доступ открывается через “сеттеры” и “геттеры”(собственно, модификаторы).
Полиморфизм
И снова Википедия: “Полиморфизм в языках программирования и теории типов — способность функции обрабатывать данные разных типов”. Если мы рассмотрим класс Item(вариант с сокрытием), то метод setId(setName также) имеет в себе реализацию полиморфизма, т.к. принимает в себя параметр различных типов и приводит его к нужному.