SOLID принципы в ООП: Примеры применения SOLID принципов

SOLID принципы в ООП: Примеры применения SOLID принципов

22.04.2023
276
Описание применения принципов SOLID в PHP, подробная инструкция с примерами.

Принцип единственной ответственности (SRP)

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

class User {
   //Класс User отвечает только за работу с пользователями
   public function login($username, $password) {
      //логика входа пользователя
   }

   public function logout() {
      //логика выхода пользователя
   }

   public function register($data) {
      //логика регистрации пользователя
   }
}

Принцип открытости/закрытости (OCP)

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

interface Shape {
   public function area();
}

class Rectangle implements Shape {
   private $width;
   private $height;

   public function __construct($width, $height) {
      $this->width = $width;
      $this->height = $height;
   }

   public function area() {
      return $this->width * $this->height;
   }
}

class Circle implements Shape {
   private $radius;

   public function __construct($radius) {
      $this->radius = $radius;
   }

   public function area() {
      return $this->radius * $this->radius * pi();
   }
}

Принцип подстановки Барбары Лисков (LSP)

Принцип подстановки Барбары Лисков заключается в том, что объекты должны быть заменяемыми на экземпляры их подтипов без изменения корректности программы. То есть, везде, где используется базовый класс, можно использовать его производный класс.

class Rectangle {
   protected $width;
   protected $height;

   public function __construct($width, $height) {
      $this->width = $width;
      $this->height = $height;
   }

   public function setWidth($width) {
      $this->width = $width;
   }

   public function setHeight($height) {
      $this->height = $height;
   }

   public function area() {
      return $this->width * $this->height;
   }
}

class Square extends Rectangle {
   //подтип Square можно использовать везде, где используется Rectangle
   public function setWidth($width) {
      $this->width = $width;
      $this->height = $width;
   }

   public function setHeight($height) {
      $this->width = $height;
      $this->height = $height;
   }
}

function printArea(Rectangle $rectangle) {
   return $rectangle->area();
}

$rectangle = new Rectangle(2, 3);
$square = new Square(5);

printArea($rectangle); // 6
printArea($square); // 25

Принцип разделения интерфейса (ISP)

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

interface Printable {
   public function print();
}

interface Faxable {
   public function fax();
}

class Printer implements Printable {
   public function print() {
      //логика печати
   }
}

class Fax implements Faxable {
   public function fax() {
      //логика отправки факса
   }
}

class AllInOne implements Printable, Faxable {
   public function print() {
      //логика печати
   }

   public function fax() {
      //логика отправки факса
   }
}

Принцип инверсии зависимостей (DIP)

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

interface DatabaseInterface {
   public function connect();
}

class MySQL implements DatabaseInterface {
   public function connect() {
      //логика подключения к MySQL
   }
}

class PostgreSQL implements DatabaseInterface {
   public function connect() {
      //логика подключения к PostgreSQL
   }
}

class User {
   private $db;

   public function __construct(DatabaseInterface $db) {
      $this->db = $db;
   }

   public function login($username, $password) {
      $this->db->connect();
      //логика входа пользователя
   }
}

$mysql = new MySQL();
$user = new User($mysql);
$user->login('username', 'password');

Заключение

Принципы SOLID являются основными принципами объектно-ориентированного программирования. Их применение позволяет создавать гибкие и расширяемые программы. Приведенные примеры демонстрируют, как эти принципы можно применять в PHP.