2010-01-12 2 views
2

클래스가 있는지 여부와 인터페이스를 구현하는지 여부를 확인하고 싶습니다. 아래 두 가지 모두 작동해야합니다. 어느 것이 선호되어야하며 그 이유는 무엇입니까?클래스가 존재하고 인터페이스를 구현하는지 확인하기 위해 리플렉션 또는 인스턴스화를 사용해야합니까?

//이 클래스가 존재하는 경우, 확인을 인스턴스화하고 그것이 주석에게

if(class_exists($classname)){ 
    $r=new new ReflectionClass($classname); 
    if($r->implementsInterface('Annotation)) {//do something} 
    } 
를 구현하는 경우 클래스가 존재하는 경우, 확인 그것의 반사를하고 알아 // 주석에게

if(class_exists($classname)){ 
    $tmp=new $classname; 
    if($obj instanceof Annotation) {//do something} 
    } 

를 구현하는지 확인

+0

인스턴스가 있습니까 (아니면 어쨌든 인스턴스를 만들 것입니까?)? 아니면 수업을 검사하고 싶습니까? 때로는 객체를 만드는 것이 부작용, 보호 된 생성자, 지연로드 등으로 인해 옵션이 될 수 없습니다. – VolkerK

+0

실제로 필요하기까지 인스턴스 생성을 지연하려고합니다. 초기화되지 않은 인스턴스 ('$ tmp'와 같은)는 그리 나쁘지는 않지만 초기화 된 인스턴스는 매우 클 수 있습니다. – dnagirl

답변

10

체크 아웃이 기능

  • class_implements 반환 지정된 클래스
  • class_parents 반환 지정된 클래스의 상위 클래스
  • is_a 검사에 의해 구현되는 인터페이스를이 방법을 사용 객체가이 클래스의 클래스이거나이 클래스를 부모의 클래스로 가지는 경우

클래스 또는 인스턴스의 내성을 위해 Reflection 클래스보다이 값을 선호합니다. The Reflection API리버스 엔지니어링 클래스입니다.

interface_exists 또는 property_exists, etc과 같은 다른 많은 사용자 기본 기능이 있습니다.

+0

+1 좋은 +1. ReflectionClass는이 단순한 함수 호출과 비교하여 과도한 것으로 보인다 :) – Lukman

+0

아주 멋지다! 어떻게 그 기능을 놓쳤습니까? – dnagirl

+0

요점은 인터페이스가 클래스의 유전에 의존하지 않는다는 점입니다. PHP (AFAIK)에서 인터페이스는 일등급 엔티티로 존재하지 않으므로 이러한 함수가 예상대로 작동하지 않을 수 있습니다. 예 : 개, 마우스 및 고양이는 공통 인터페이스를 구현할 수 있지만 공통 기본 클래스가 없을 수 있습니다. C. – symcbean

1

리플렉션은 객체를 인스턴스화하지 않고 유효성을 검사 할 수있는 가장 좋은 방법 인 &입니다. 그러나 주석을 구현하지 않고 객체 생성이 더 많은 자원 오버 헤드 인 경우 객체를 필요로하지 않으면 객체를 만드는 것이 바람직하지 않습니다. 이 시나리오에서 반사 기술을 사용하는 것이 좋습니다.

Annotation을 구현하는지 여부에 관계없이 객체를 계속 사용하는 경우 객체를 생성하고 Annotation 인터페이스를 구현하는지 여부를 확인할 수 있습니다. 가장 좋은 방법은 없으며 대신 최상의 방법을 생각할 수 있습니다.

0

ReflectionClass을 사용하면 더 좋은 방법입니다. 또한 점검을 수행하기 위해 클래스를 인스턴스화 할 필요도 없습니다.

0

이것은 일반적인 방법입니다. 또한

if(class_exists($classname)){ 
    $tmp=new $classname; 
    if($obj instanceof Annotation) {//do something} 
    } 
관련 문제