네임스페이스 내에 클래스가 있는지 확인하는 방법
이거 있어요.
use XXX\Driver\Driver;
...
var_dump(class_exists('Driver')); // false
$driver = new Driver(); // prints 123123123 since I put an echo in the constructor of this class
exit;
음... 이 동작은 매우 불합리합니다(PHP에 따라 존재하지 않는 클래스의 오브젝트를 만듭니다).지정된 네임스페이스 아래에 클래스가 존재하는지 확인할 수 있는 방법이 있습니까?
클래스를 확인하려면 네임스페이스(full path)를 사용하여 클래스를 지정해야 합니다.
namespace Foo;
class Bar
{
}
그리고.
var_dump(class_exists('Bar'), class_exists('\Foo\Bar')); //false, true
-즉, 클래스에 대한 전체 경로를 지정해야 합니다.글로벌 컨텍스트가 아닌 이름 공간에서 정의했습니다.
그러나 샘플에서와 같이 네임스페이스 내에서 클래스를 Import할 경우 네임스페이스 없이 Import된 이름을 통해 참조할 수 있지만 동적 구성, 특히 클래스 이름을 형성하는 인라인 문자열에서는 참조할 수 없습니다.예를 들어, 다음의 모든 것이 실패합니다.
namespace Foo;
class Bar {
public static function baz() {}
}
use Foo\Bar;
var_dump(class_exists('Bar')); //false
var_dump(method_exists('Bar', 'baz')); //false
$ref = "Bar";
$obj = new $ref(); //fatal
기타 등등.이 문제는 Import된 에일리어스에 대한 작업 메커니즘에 있습니다.따라서 이러한 구성을 사용할 때는 전체 경로를 지정해야 합니다.
var_dump(class_exists('\Foo\Bar')); //true
var_dump(method_exists('\Foo\Bar', 'baz')); //true
$ref = 'Foo\Bar';
$obj = new $ref(); //ok
이 문제는 (매뉴얼 페이지 사용자 노트에 언급된 바와 같이) 클래스 이름이 문자열로 지정될 때마다 별칭이 고려되지 않는다는 것입니다.이는 클래스 이름을 갖는 다른 함수에도 영향을 미칩니다.is_a()
따라서 클래스 이름을 문자열에 지정할 경우 완전한 네임스페이스를 포함해야 합니다(예:'\XXX\Driver\Driver'
,'XXX\\Driver\\Driver'
).
PHP 5.5는class
이 목적을 위해서만 상수:
use XXX\Driver\Driver;
...
if (class_exists(Driver::class)) {
...
}
언급URL : https://stackoverflow.com/questions/22407370/how-to-check-if-class-exists-within-a-namespace
'IT' 카테고리의 다른 글
스위치가 다음과 같은 경우보다 빠른 이유 (0) | 2022.10.28 |
---|---|
오류 "1038 메모리가 부족합니다. 정렬 버퍼 크기를 늘리는 것을 고려하십시오. (0) | 2022.10.28 |
fetch를 사용한 기본 인증? (0) | 2022.10.28 |
IntelliJ의 코드 커버리지 정보 클리어 (0) | 2022.10.28 |
static const와 const의 차이점은 무엇입니까? (0) | 2022.10.28 |