트레이트 – 04.충돌 방지 메커니즘

충돌 방지 메커니즘(Conflict Resolution Mechanism)

트레이트 메소드 간의 충돌이 발생하면 치명적인 오류(Fatal error)가 발생합니다. 아래 예제에서는 트레이트 Hello와 World 메소드 이름 sayHello가 충돌했기 때문에 PHP는 컴파일할 때 어느 메소드를 조합해야 할지 알 수 없기 때문에 컴파일을 중단합니다.

트레이트 메소드 간에 충돌이 발생

충돌(conflict)과 관련하여 다음과 같은 의미 체계(semantics)를 가지고 있습니다.

  1. 트레이트는 런타임에 의미(semantics)를 추가하지 않고 클래스를 만드는 과정(process of building)에만 참여합니다.
  2. 트레이트는 메소드 재정의 우선 순위에 통합됩니다.
  3. 복잡성을 피하기 위해 트레이트 메소드 간의 충돌을 명시적으로 방지해야 합니다. 그렇지 않으면 경고가 발생하고 충돌하는 메소드는 제외됩니다.
  4. 트레이트 간에 충돌이 발생하면 개발자는 어떤 메소드를 사용할지 명시적으로 선택해야 하며 선택하지 않은 메소드는 조합에서 제외됩니다.
  5. 충돌하는 메소드를 재사용 할 수 있도록 메소드에 별칭을 부여할 수 있습니다.
  6. 트레이트는 또 다른 트레이트를 조합할 수 있습니다.
  7. 트레이트는 추상 메소드로 요구명세(requirement)를 명시적으로 선언(make)할 수 있습니다.

이러한 의미 체계(semantics)의 결과로 런타임에 살펴보면, 트레이트를 사용하여 생성된 클래스와 트레이트를 사용하지 않는 클래스와 구별되지 않지만 대신 기존의 코드 중복(code duplication)과는 구별됩니다.

parent와 $this의 의미도 변경되지 않았습니다. 트레이트 메소드에서 사용하면 메소드가 클래스에서 직접 정의된 것처럼 똑같이 동작합니다. 이 부분에 대하여는 ‘클래스 스코프’ 글에서 살펴보겠습니다.

답글 남기기