Инкапсуляция - это механизм защиты вашего класса и структуры данных. Это делает вашу жизнь намного проще. С Encapsulation у вас есть элемент управления для доступа и установки параметров и методов класса. У вас есть контроль, чтобы сказать, какая часть видна посторонним и как можно установить параметры ваших объектов.
Доступ и настройка параметров класса
(Good Way)
<?php
class User
{
private $gender;
public function getGender()
{
return $this->gender;
}
public function setGender($gender)
{
if ('male' !== $gender and 'female' !== $gender) {
throw new \Exception('Set male or female for gender');
}
$this->gender = $gender;
}
}
Теперь вы можете создать объект из вашего класса User и можете безопасно устанавливать гендерные параметры. Если вы установите что-то, что не подходит для вашего класса, тогда будет выброшено исключение. Вы можете подумать, что в этом нет необходимости, но когда ваш код растет, вы хотели бы видеть значимое сообщение об исключении, а не неловкую логическую проблему в системе без исключения.
$user = new User();
$user->setGender('male');
// An exception will throw and you can not set 'Y' to user gender
$user->setGender('Y');
(Плохой путь)
Если вы не будете следовать ролям Encapsulation, ваш код будет выглядеть примерно так. Очень сложно поддерживать. Обратите внимание, что мы можем установить что-либо для свойства пола пользователя.
<?php
class User
{
public $gender;
}
$user = new User();
$user->gender = 'male';
// No exception will throw and you can set 'Y' to user gender however
// eventually you will face some logical issue in your system that is
// very hard to detect
$user->gender = 'Y';
Методы класса доступа
(Good Way)
<?php
class User
{
public function doSomethingComplex()
{
$this->doThis(...);
...
$this->doThat(...);
...
$this->doThisExtra(...);
}
private function doThis(...some Parameters...)
{
...
}
private function doThat(...some Parameters...)
{
...
}
private function doThisExtra(...some Parameters...)
{
...
}
}
Мы все знаем, что мы не должны создавать функцию с 200 строками кода, вместо этого мы должны разбить ее на какую-то отдельную функцию, которая нарушает код и улучшает читабельность кода. Теперь с инкапсуляцией вы можете сделать эти функции частными, это означает, что они недоступны для посторонних, и позже, когда вы захотите изменить функцию, вы будете очень довольны, увидев ключевое слово private.
(Плохой путь)
class User
{
public function doSomethingComplex()
{
// do everything here
...
...
...
...
}
}