현재 위치: > 최신 기사 목록> is_a () 참고 인터페이스 구현을 감지 할 때

is_a () 참고 인터페이스 구현을 감지 할 때

M66 2025-06-05

기본 사용

IS_A () 함수의 기본 구문은 다음과 같습니다.

<code> is_a (object | String $ object_or_class, String $ class, bool $ allow_string = false) : bool </code>
  • $ object_or_class는 객체 또는 클래스 이름 (문자열) 일 수 있습니다.

  • $ class는 감지 할 대상 클래스 또는 인터페이스 이름입니다.

  • $ allow_string 첫 번째 매개 변수가 문자열 (클래스 이름)이 허용되는지 여부를 결정하고 기본값은 false 로 결정됩니다.

예:

<code> 인터페이스 LoggerInterface {}

클래스 FilElogger는 LoggerInterface {}을 구현합니다.

$ logger = 새로운 fillegger ();

var_dump (is_a ($ logger, loggerinterface :: class)); // 출력 : bool (true)
</코드>


주목해야 할 것

1. 체인의 상위 인터페이스를 상속하지 않고 구현을 감지합니다.

IS_A ()를 사용하여 인터페이스를 확인할 때 객체가 인터페이스를 구현하는지 여부 만 감지하고 상위 클래스가 인터페이스를 간접적으로 구현하는지 확인하지 않습니다. 이것은 일부 정적 분석 도구 동작과 다릅니다.

<code> 인터페이스 a {} 인터페이스 b는 a {}을 확장합니다.

클래스 myclass 구현 b {}

$ obj = new MyClass ();

// 옳은
var_dump (is_a ($ obj, b :: class)); // bool (true)

// B가 상속되기 때문에 또한 정확합니다
var_dump (is_a ($ obj, a :: class)); // bool (true)
</코드>

결론 : 인터페이스 상속 체인은 IS_A () 에 의해 고려되며, 이는 "직접"인터페이스 구현 만 확인하는 몇 가지 방법과 다릅니다.


2. 문자열을 객체 감지로 전달할 때 $ allow_string이 활성화되어야합니다.

클래스 이름 문자열이 객체가 아닌 전달되면 세 번째 매개 변수 $ allow_string은 true 로 설정되어야합니다. 그렇지 않으면 is_a ()는 항상 false를 반환합니다.

<code> 인터페이스 서비스 {}

클래스 APISERVICE는 서비스 {}를 구현합니다.

$ className = apiService :: class;

var_dump (is_a ($ classname, service :: class, true)); // bool (true)
</코드>

세 번째 매개 변수가 생략되거나 False 로 설정되면 위 코드는 False를 반환합니다.


3. 인터페이스 이름은 자격을 갖춘 이름이어야합니다.

IS_A ()를 사용하는 경우 인터페이스 이름은 완전히 자격을 갖춘 클래스 이름 (예 : 네임 스페이스 포함)이어야합니다. 자동로드 메커니즘 또는 더 복잡한 네임 스페이스 구조를 사용할 때 특히 중요합니다.

예를 들어:

<code> 네임 스페이스 앱 \ 서비스;

인터페이스 지불 인터페이스 {}

Class PayPalservice는 PaymentInterface {}를 구현합니다.
</코드>

테스트에주의하십시오.

<code> app \ services \ PayPalservice 사용; App \ Services \ PaymentInterface를 사용합니다.

$ service = new PayPalservice ();

var_dump (is_a ($ service, paymentInterface :: class)); // bool (true)
</코드>

그렇지 않으면, 특히 인터페이스 이름이 잘못되었거나 사용이 가져 오지 않은 경우, 거짓이 반환 될 수 있습니다.


4. 객체 확인을 위해 인스턴스를 대체하는 것이 좋습니다.

IS_A ()는 객체 인스턴스 검사에서 인스턴스 와 일관되게 작동하지만 인스턴스는 성능 및 코드 가독성 측면에서 더 좋습니다. 예를 들어:

<code> if ($ logger instanceof loggerinterface) {// 권장} </code>

문자열 형식으로 클래스 이름을 동적으로 판단 해야하는 경우 먼저 인스턴스를 사용하는 것이 좋습니다.


5. 인터페이스가 다른 인터페이스를 구현하는지 확인하십시오

인터페이스 자체를 인스턴스화 할 수는 없지만 한 인터페이스가 다른 인터페이스를 상속하는지 확인할 수 있습니다. 이것은 컨테이너에 클래스를 반영하거나 자동으로 등록 할 때 유용합니다.

<code> interface baseinterface {} 인터페이스 서브 interface는 baseinterface {}을 확장합니다.

var_dump (is_a (subinterface :: class, baseinterface :: class, true)); // bool (true)
</코드>

이 사용법은 일반적으로 class_implements () 와 같은 함수와 함께 사용되며 컨테이너 스캔에 특히 적합합니다.

<code> $ classes = [ 'm66.net/service/alphaservice.php', 'm66.net/service/betaservice.php'];

foreach ($ classes as $ classPath) {
// 클래스를 반영하거나 동적으로로드 한 후 클래스가 인터페이스를 구현하는지 확인하십시오.
$ class = get_class_from_file ($ classPath); //이 기능을 구현한다고 가정합니다

 if (is_a($class, \App\Contracts\HandlerInterface::class, true)) {
    // 등록 서비스
}

}
</코드>