Принцип единственной ответственности (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.