개발 지식

개발 지식

PHP PHP에서 인터페이스와 트레이트 혼용 설계 팁

페이지 정보

profile_image
영삼이
0건 176회 25-03-28 22:47

본문

✅ PHP에서 인터페이스와 트레이트 혼용 설계 팁

인터페이스와 **트레이트(Trait)**는 객체지향 PHP에서 전혀 다른 목적을 가지고 있지만, 함께 사용하면 유연하고 재사용성 높은 설계를 할 수 있습니다.


🔍 인터페이스 vs 트레이트

  • 인터페이스: 클래스가 구현해야 할 메서드의 "형태"만 정의 (강제 계약)

  • 트레이트: 다중 상속의 대안, 실제 메서드 구현을 공유 가능 (코드 재사용)


🧩 인터페이스 + 트레이트 조합 예시

[code=php]
interface LoggerInterface {
    public function log(string $message): void;
}

trait FileLoggerTrait {
    public function log(string $message): void {
        file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
    }
}
[/code]
[code=php]
class UserService implements LoggerInterface {
    use FileLoggerTrait;

    public function createUser() {
        // 사용자 생성 로직
        $this->log("User created");
    }
}
[/code]
  • LoggerInterface는 계약(메서드 시그니처)을 강제

  • FileLoggerTrait는 그 구현을 제공

  • UserService는 구현체이자 재사용 가능한 구조가 됨


💡 강제성과 재사용의 분리

  • 인터페이스는 "이 메서드는 반드시 있어야 해" 라는 강제

  • 트레이트는 "이 코드는 공통이야, 재사용하자" 라는 공유

  • 둘을 조합하면 강제성과 재사용을 동시에 충족할 수 있음


⚠️ 주의점

  1. 트레이트 내부에서 인터페이스 준수를 보장하지 않음
    → 트레이트가 log()를 제공해도 클래스가 implements LoggerInterface 하지 않으면 계약이 아님

  2. 이름 충돌 주의
    → 여러 트레이트를 사용할 경우 동일 메서드가 있으면 충돌 가능


✅ 정리

  • 인터페이스는 "구조", 트레이트는 "내용"

  • 클래스는 인터페이스를 구현하고, 트레이트로 그 구현을 공유

  • 이 조합은 유지보수와 테스트를 더 깔끔하게 만들어줌


댓글목록

등록된 댓글이 없습니다.