트레이트 – 19.리플렉션 API

리플렉션 API

PHP 5에는 클래스, 인터페이스, 함수, 메소드 및 확장(extension)에 대하여 스스로 자기 분석하는 기능을 완비한 리플렉션 API(reflection API)가 제공됩니다. 또한 리플렉션 API는 함수, 클래스 및 메소드에 대한 문서 주석(doc comment)을 검색하는 방법을 제공합니다. 예를 들어 임의의 클래스에 대한 정보, 즉 해당 클래스의 생성자, 프로퍼티, 메소드, 부모 클래스 및 상위 인터페이스에 대한 정보 등을 얻을 수 있게 해주는 기능을 합니다.

트레이트의 리플렉션 기능은 별도로 구현되지 않았고, 클래스 리플렉션(ReflectionClass::)의 클래스 관련 기능에 포함되어 구현되고 있습니다. 그러나 트레이트와 관련해서는 아직 PHP 매뉴얼 상에 문서화 되어 있지 않습니다. 아래와 같은 트레이트 리플렉션을 위해 추가된 메소드들의 경우에도, 단지 매개변수 목록만 제공되고 있습니다.

ReflectionClass::isTrait 메소드를 제외한 나머지 3개의 메소드들은 클래스에 조합된 트레이트 정보를 반환하는 메소드이므로, 조합되지 않은 트레이트 정보는 반환하지 못합니다. 정의만 되어 있고 클래스에 조합되지 않은 트레이트의 이름을 얻기 위해서는 ‘트레이트 관련 함수’ 글에서 살펴볼 Classes/Object 함수인 get_declared_traits 함수를 이용할 수 있습니다.

조합되지 않은 트레이트 정보의 반환 여부를 확인하기 위하여, 아래와 같이 구성된 조합되지 않은 트레이트 World를 포함한 프로그램 소스에 대하여 트레이트 리플렉션 메소드 별로 실험해 보겠습니다.

조합되지 않은 트레이트가 있는 경우

트레이트는 자신을 인스턴스화 하지 못합니다. 그러나 리플렉션 클래스는 트레이트에 대하여도 리플렉션 인스턴스를 생성하여 트레이트 정보를 제공합니다.

클래스 리플렉션 메소드를 통해 클래스 정보 뿐만 아니라 트레이트의 정보도 확인할 수 있습니다. 예를 들어 ReflectionClass::getMethods 메소드는 클래스에 포함된 메소드를 배열로 반환해 주는 기능을 수행하고 있으나 트레이트에 포함된 메소드까지 배열로 반환해 줍니다.

실행하면 아래와 같이 클래스(또는 트레이트)에 정의된 메소드 이름과 메소드가 정의된 클래스(또는 트레이트) 이름을 배열로 반환 받을 수 있습니다. 그러나 메소드가 정의된 곳이 클래스인지 트레이트인지는 구분할 수 없습니다.

ReflectionClass::getTraitAliases

public array ReflectionClass::getTraitAliases ( void )

새로운 이름(별칭)의 메소드 이름을 배열 키로, 원래의 이름(‘TraitName::originalMethodName’의 형식으로)을 배열 값으로 반환하며, 오류가 발생하면 NULL을 반환합니다.

실행 결과는 아래와 같습니다.

ReflectionClass::getTraitNames

public array ReflectionClass::getTraitNames ( void )

클래스에 조합된 트레이트 이름을 배열 값으로 반환하며, 오류가 발생하면 NULL을 반환합니다.

실행 결과는 아래와 같습니다.

ReflectionClass::getTraits

public array ReflectionClass::getTraits ( void )

클래스에 조합된 트레이트 이름을 배열 키로, 트레이트의 리플렉션 인스턴스를 배열 값으로 반환하며, 오류가 발생하면 NULL을 반환합니다.

실행 결과는 아래와 같습니다. 클래스 구조에 따라 조합된 트레이트의 리플렉션 인스턴스를 배열로 반환하고 있습니다.

ReflectionClass::isTrait

public bool ReflectionClass::isTrait ( void )

트레이트인지 아닌지를 판단하여 트레이트는 TRUE, 아니면 FALSE를 반환하며, 오류가 발생하면 NULL을 반환합니다.

ReflectionClass::isTrait 메소드는 자기 자신에 대하여 트레이트인지 여부를 판단하기 때문에 클래스에 조합되어있지 않은 트레이트에 대하여도 확인할 수 있습니다.

실행 결과는 아래와 같습니다. 트레이트 World는 클래스에 조합되어 있지 않고, 정의만 되어 있음에도 트레이트임을 확인해 주고 있습니다.

답글 남기기