SOLID 원칙은 객체 지향 프로그래밍에서 중요한 설계 원칙으로, 소프트웨어 개발의 유지보수성, 확장성 및 관리 가능성을 증진시키는 데 도움이 됩니다. 아래에서는 각 원칙을 PHP 예시 코드와 함께 설명하겠습니다:

1. 단일 책임 원칙 (SRP)

클래스는 변경되어야 하는 한 가지 이유만 가져야 하며, 즉 하나의 작업만 담당해야 합니다.

예시: OrderProcessor 클래스는 주문 처리만 담당하고, 로깅이나 데이터베이스 관리와 같은 다른 책임은 처리하지 않아야 합니다.

class OrderProcessor {
    public function process(Order $order) {
        // 주문 처리 로직
    }
}
 
class OrderLogger {
    public function log(Order $order) {
        // 주문 세부사항 로깅
    }
}

2. 개방-폐쇄 원칙 (OCP)

클래스는 확장에는 열려 있어야 하지만, 수정에는 닫혀 있어야 합니다. 즉, 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 합니다.

예시: 기본 필터 클래스를 확장하는 다양한 유형의 필터를 구현합니다.

interface Filter {
    public function apply(array $items);
}
 
class NameFilter implements Filter {
    public function apply(array $items) {
        // 이름 필터링 로직
    }
}
 
class AgeFilter implements Filter {
    public function apply(array $items) {
        // 나이 필터링 로직
    }
}

3. 리스코프 치환 원칙 (LSP)

슈퍼클래스의 객체는 그 서브클래스의 객체로 대체할 수 있어야 하며, 이를 통해 애플리케이션을 손상시키지 않아야 합니다.

예시: Bird 클래스와 그 서브클래스 Duck입니다. Bird 객체가 사용되는 모든 곳에서 Duck 객체로 대체할 수 있어야 합니다.

class Bird {
    public function fly() {
        // 비행 로직
    }
}
 
class Duck extends Bird {
    // Duck은 Bird의 fly 메소드를 사용합니다.
}

4. 인터페이스 분리 원칙 (ISP)

클라이언트는 사용하지 않는 메소드에 의존하도록 강요되어서는 안 됩니다. 인터페이스는 사용하는 클라이언트에 특화되어야 합니다.

예시: 큰 인터페이스를 더 작고 구체적인 여러 인터페이스로 분할합니다.

interface WorkerInterface {
    public function work();
}
 
interface EaterInterface {
    public function eat();
}
 
class HumanWorker implements WorkerInterface, EaterInterface {
    public function work() {
        // 작업 구현
    }
 
    public function eat() {
        // 식사 구현
    }
}

5. 의존성 역전 원칙 (DIP)

고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 둘 다 추상화에 의존해야 합니다. 추상화는 세부 사항에 의존하지 않아야 하며, 세부 사항은 추상화에 의존해야 합니다.

예시: DatabaseConnection 인터페이스가 MySQLConnection 클래스에 의해 구현됩니다. 고수준 모듈은 구체적인 MySQLConnection이 아닌 DatabaseConnection 인터페이스에 의존합니다.

interface DatabaseConnection {
    public function connect();
}