PHP 5.4 버전부터 객체 지향 프로그래밍을 위해 트레이트(Trait)라는 기능이 도입되었습니다. 트레이트는 클래스와 매우 유사하지만, 메서드들을 세분화되고 안정적인 방식으로 묶어주기 위한 목적으로만 사용됩니다. 따라서 트레이트 자체를 인스턴스화하는 것은 허용되지 않습니다.
그렇다면 왜 트레이트가 필요할까요? PHP는 단일 상속(Single Inheritance) 언어이기 때문에, 하나의 클래스는 오직 하나의 부모 클래스로부터만 상속받을 수 있습니다. 이러한 구조적 제약 때문에 여러 클래스에서 동일한 기능을 재사용해야 할 때 불편함이 발생합니다. 트레이트는 바로 이 문제를 해결하기 위해 등장했으며, 서로 다른 클래스 계층에 속한 여러 독립적인 클래스에서 메서드 집합을 자유롭게 재사용할 수 있도록 도와줍니다.
예제 코드
<?php
trait Reader {
public function add($var1, $var2) {
return $var1 + $var2;
}
}
trait Writer {
public function multiplication($var1, $var2) {
return $var1 * $var2;
}
}
class File {
use Reader;
use Writer;
public function calculate($var1, $var2) {
echo "Result of addition:" . $this->add($var1, $var2) . "\n";
echo "Result of multiplication:" . $this->multiplication($var1, $var2);
}
}
$o = new File();
$o->calculate(5, 3);
?>
실행 결과
Result of addition:8
Result of multiplication:15
코드 설명
위 예제에서는 Reader와 Writer라는 두 개의 트레이트를 정의하고, 하나의 File 클래스 안에서 두 트레이트에 포함된 메서드를 모두 가져와 사용했습니다. 트레이트 덕분에 하나의 클래스에서 여러 개의 기능(메서드)에 자유롭게 접근할 수 있는 것입니다.
즉, 트레이트를 활용하면 상속 계층 구조에 얽매이지 않고도 필요한 기능들을 마치 조각처럼 조합해 클래스를 확장할 수 있습니다. 이는 코드 중복을 줄이고 유지보수성을 높이는 데 큰 도움이 됩니다.
참고 사항
클래스 내부에서 트레이트를 불러올 때는 use 키워드를 사용합니다. 또한 하나의 클래스에는 여러 개의 트레이트를 동시에 적용할 수 있으며, 만약 여러 트레이트에서 같은 이름의 메서드가 충돌하는 경우에는 insteadof 연산자를 통해 어떤 메서드를 사용할지 명시적으로 지정할 수 있습니다.