PHP에서 IS_A () 함수는 종종 객체가 특정 클래스 또는 하위 클래스에 속하는지 여부를 결정하는 데 사용됩니다. 이것은 유형 확인 및 객체 지향 프로그래밍에 매우 유용합니다. 그러나 익명 클래스가 관련되면 IS_A () 의 동작에는 예상치 못한 "구덩이"가있을 수있어 코드 판단 오류가 발생하고 프로그램 논리에 영향을 미칩니다.
이 기사는 특정 사례를 결합하여 IS_A ()를 사용하여 익명 클래스를 판단 할 때 발생할 수있는 문제를 깊이 분석하고 합리적인 솔루션을 제공합니다.
IS_A () 함수의 구문은 다음과 같습니다.
is_a(object|string $object_or_class, string $class_name, bool $allow_string = false): bool
$ object_or_class가 $ class_name 의 인스턴스인지 하위 클래스인지 여부를 결정하는 데 사용됩니다.
간단한 예를 들기 위해 :
class Foo {}
$obj = new Foo();
var_dump(is_a($obj, 'Foo')); // true
이것은 매우 직관적입니다.
익명 클래스는 명시적인 클래스 이름없이 런타임에 동적으로 정의되는 클래스입니다. 예를 들어:
$anon = new class {
public function sayHello() {
return "Hello";
}
};
익명의 클래스에는 class@anonymous/path/to/file.php : php by php와 같은 내부 이름이 할당되지만이 이름은 예측할 수 없으며 유형 판단으로 직접 사용할 수 없습니다.
다음 코드가 있다고 가정합니다.
class Base {}
$anon = new class extends Base {};
var_dump(is_a($anon, 'Base')); // 산출 true
var_dump(is_a($anon, 'class@anonymous')); // 산출 false,익명 클래스의 내부 이름은 인식 할 수 없습니다.
익명 클래스의 내부 이름을 직접 사용하여 판단을 내리는 경우 이름이 동적이며 경로와 줄 번호가 포함되어 있기 때문에 올바르게 일치하기가 어렵습니다.
익명 클래스의 이름에는 파일 경로와 다음과 같은 줄 번호가 포함됩니다.
class@anonymous /path/to/file.php:10
이것은 우리가 익명 클래스 이름을 하드 코딩하여 판단을 할 수 없게 만듭니다.
IS_A () 의 두 번째 매개 변수는 문자열 유형의 클래스 이름이어야하지만 익명 클래스 이름은 고정되지 않고 참조하기가 어렵습니다.
익명의 클래스는 다른 클래스를 상속 할 수 있지만, 인스턴스에 대한 IS_A () 의 상속 판결은 유효합니다. 코드 로직 하드 코드가 문자열 클래스 이름으로 익명 클래스 이름을 하드 코딩하면 판단이 필연적으로 실패합니다.
익명 클래스는 특정 클래스를 상속하기 때문에 대개 객체가 부모 클래스의 인스턴스인지 판단합니다.
var_dump(is_a($anon, Base::class)); // true
이것은 또한 가장 쉽고 권장되는 방법입니다.
인터페이스를 정의하고 익명 클래스가이를 구현하도록 활성화하여 인터페이스 유형을 사용하여 판단이 명확 해집니다.
interface SayHelloInterface {
public function sayHello();
}
$anon = new class implements SayHelloInterface {
public function sayHello() {
return "Hello";
}
};
var_dump(is_a($anon, SayHelloInterface::class)); // true
특별한 필요성이 아닌 경우, 코드는 익명 클래스의 "실제 클래스 이름"을 판단하지 않고 대신 부모 클래스 또는 인터페이스를 통해 유형 판단을 내려야합니다.
<?php
class Base {
public function who() {
return "I am Base";
}
}
interface GreetInterface {
public function greet(): string;
}
// 익명 상속 Base
$anon1 = new class extends Base {
public function who() {
return "I am Anonymous extending Base";
}
};
// 익명 클래스는 인터페이스를 구현합니다
$anon2 = new class implements GreetInterface {
public function greet(): string {
return "Hello from anonymous";
}
};
echo is_a($anon1, Base::class) ? "anon1 is Base\n" : "anon1 is NOT Base\n";
echo is_a($anon2, GreetInterface::class) ? "anon2 implements GreetInterface\n" : "anon2 does NOT implement GreetInterface\n";
// 오류 데모:익명 클래스의 내부 이름을 직접 판단하십시오(사용할 수 없습니다)
$className = get_class($anon1);
echo "Class name of anon1: $className\n";
var_dump(is_a($anon1, $className)); // true, 하지만 $className 하드 코딩 된 판단에 적합하지 않습니다
익명 클래스의 클래스 이름은 경로와 줄 번호로 동적으로 생성되며 판단의 기초로 직접 사용할 수 없습니다.
IS_A () 가 익명 클래스 인스턴스가 특정 부모 클래스 또는 인터페이스의 인스턴스인지를 결정하면 상속 관계 판단이 정상적이고 유효합니다.
익명 클래스 "실제 클래스 이름"에 직접 의존하지 않도록 부모 클래스 또는 인터페이스를 통해 객체 유형을 판단하는 것이 좋습니다.
이러한 방식으로 작성된 코드는 더 강력하고 객체 지향 디자인의 원리를 준수합니다.
코드에 익명 클래스의 유형 판단이 포함 된 경우 위의 "피트"를 염두에두고 솔루션은 많은 불필요한 디버깅 및 오류를 피할 수 있습니다. 이 기사가 PHP 익명 클래스와 IS_A ()를 이해하는 데 도움이되기를 바랍니다.