본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP trait — 수평 상속(다중 코드 재사용) 완전 정리

by 왕진 2026. 6. 18.
반응형

 

 

Web Development · PHP trait

PHP trait —
여러 클래스에 같은 기능을 끼워 넣기 (수평 상속)

extends와 use를 함께 사용하는 다중 재사용 패턴
시작 오늘 분석할 코드
trait SayMorning{ public function print_morning(){ print $this->name; print "님, 안녕하세요!<BR>"; } } class User{ private $name = null; public function print_hello(){...} } class Guest extends User{ use SayMorning; // trait 끼워 넣기 (수평 상속) private $name = "게스트"; public function print_hello(){...} } $newuser = new Guest(); $newuser->print_hello(); // 오버라이딩된 자식 메서드 $newuser->print_morning(); // trait의 메서드
게스트님, 처음 뵙겠습니다!
게스트님, 안녕하세요!

Guest는 User를 부모로 상속(수직)하면서 SayMorning trait도 함께 사용(수평) — PHP의 단일 상속 한계를 trait로 보완.

용어 용어 정리
trait메서드 묶음을 클래스에 끼워 넣는 도구
usetrait를 클래스에 적용
수평 상속부모-자식 관계가 아닌 기능 공유
vs classtrait는 인스턴스화 못 함 — 끼워 넣기만
vs interfaceinterface는 시그니처만, trait는 구현 포함
다중 use한 클래스에 여러 trait 가능
메서드 충돌insteadof / as 키워드로 해결
실무로깅·캐시·검증 등 횡단 관심사

1 수직 vs 수평 상속
수직 (extends)
부모-자식 관계
"is-a" — Guest는 User다
1개만 가능
수평 (trait)
기능 공유
"can" — Guest는 SayMorning 가능
여러 개 가능

2 여러 trait 사용
trait Loggable { public function log() { ... } } trait Cacheable { public function cache() { ... } } class Service { use Loggable, Cacheable; // 두 trait 모두 }

3 trait의 한계
· 객체로 만들 수 없음new Trait() 불가
· 정적 분석에 어려움 (의존성 추적 까다로움)
· 너무 많은 trait 사용 시 코드 흐름 파악 어려워짐
· 같은 메서드 이름 충돌 시 명시적 해결 필요

 

반응형

 

4 trait vs interface
// interface — "이런 메서드를 구현하라"는 약속만 interface Loggable { public function log(); // 시그니처만 } // trait — "이런 메서드를 그대로 받아라" trait Loggable { public function log() { echo "log: " . date('Y-m-d'); // 실제 구현 포함 } }

핵심 한 줄 요약

trait기능 묶음 — 클래스에 끼워 넣기
use 키워드클래스 안에 trait 적용
수평 상속부모-자식 관계 아닌 기능 공유
extends + use수직과 수평 동시 가능
다중 trait한 클래스에 여러 use OK
vs interfacetrait는 구현 포함, interface는 시그니처만
실무로깅·캐시·인증 등 공통 기능
반응형

댓글