트레이트
이제 상속도 필요없다. 너와 나는 수평관계
자식 클래스가 어느덧 성장하여 나이도 있고 취업도 해서 부모와의 상속관계를 정리하고 독립적으로 일어서려고합니다.
표현이 이상하네요.
클래스에서 특정한 기능을 사용하기 위해서 부모 클래스와의 상속관계를 유지했어야 합니다.
하지만 이런 상속관계가 아닌 데려오는(?) 개념으로 트레이트가 있습니다.
즉 클래스와 클래스간에 상속을 받지 않고 너를 나에게 삽입하는 개념이라고 생각하시면 됩니다.
또 하나 클래스는 2개의 부모클래스로부터 상속을 받을 수 없습니다.
다음은 클래스를 확인해주세요.
그럼 예제를 통해서 2개 이상의 클래스로부터 상속가능한지 볼까요?
<?php class Parent { } class Parent2 { } class mickey extends Parent, Prent2 { } $mickey = new mickey; ?>
보시는 바와 같이 불가해요.
trait는 여러개를 사용할 수 있어요. 그리고 상속개념이 아닌 삽입개념이에요.
내 위에 너가 있는게 아닌 너가 있으면 나한테 잠시 뎃고 온다 이렇게 생각하시면 됩니다.
trait의 사용법은 class와 비슷하지만 trait의 인스턴스를 생성할 수는 없고 클래스를 통해서 트레이트의 메소드를 사용할 수 있어요.
trait 사용 방법
trait 트레이트명{}
그리고 클래스에서 트레이트를 사용하려면 use 키워드를 사용해요.
트레이트 삽입 방법
trait 트레이트명{} class 클래스명 { use 트레이트명; }
그럼 트레이트에 메소드도 선언해서 호출해볼까요?
<?php trait disney { public function mickey() { return '디즈니의 시작 미키마우스'; } } class marvel { use disney; } $marvel = new marvel; echo $marvel->mickey(); ?>
또 한개의 클래스에서 여러 트레이트를 사용할 수 있어요.
<?php trait disney { public function mickey() { return '디즈니의 시작 미키마우스'; } } trait TokyoDisneyLand { public function duffyAndFriends() { return '우리는 자체 캐릭터 더피를 만들어서 다른 나라 디즈니에 수출하고 있어'; } } trait HongkongDisneyLand { public function duffyhk() { return 'TDL 고마워 홍콩의 어린이들이 더피를 매우 좋아하고 있어'; } } class marvel { use disney, TokyoDisneyLand, HongkongDisneyLand; } $marvel = new marvel; echo $marvel->mickey(); echo '<br>'; echo $marvel->duffyAndFriends(); echo '<br>'; echo $marvel->duffyhk(); ?>
트레이트에 물론 프로퍼티도 사용할 수 있습니다.
<?php trait disney { public $disney = 'disney'; public function mickey() { return '디즈니의 시작 미키마우스'; } } class marvel { use disney; } $marvel = new marvel; echo $marvel->mickey(); echo '<br>'; echo $marvel->disney; ?>
자 이렇게, 상속이 아닌 삽입의 개념으로 사용할 수 있는 trait에 대해서 알아봤어요.
여러가지것들을 사용해야한다면 클래스보다는 상속이 좋겠네요. 여러 트레이트를 삽입했는데 메소드명이 같으면 오류가 발생합니다.
다음에는 이럴때 어떻게 해야할지 알아봅시다.