네임 스페이스 내에 클래스가 있는지 확인하는 방법은 무엇입니까?
나는 이것을 얻었다 :
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에 따라 존재하지 않는 클래스의 객체 생성). 주어진 네임 스페이스 아래에 클래스가 있는지 확인하는 방법이 있습니까?
클래스를 확인하려면 네임 스페이스, 전체 경로로 지정해야합니다.
namespace Foo;
class Bar
{
}
과
var_dump(class_exists('Bar'), class_exists('\Foo\Bar')); //false, true
-ie 클래스에 대한 전체 경로를 지정 해야합니다 . 전역 컨텍스트가 아닌 네임 스페이스에서 정의했습니다.
그러나 샘플에서와 같이 네임 스페이스 내에서 클래스를 가져 오는 경우 가져온 이름을 통해 네임 스페이스없이 클래스를 참조 할 수 있지만 동적 생성 및 특히 다음과 같은 인라인 문자열 내에서는이를 수행 할 수 없습니다. 클래스 이름을 형성합니다. 예를 들어 다음은 모두 실패합니다.
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
등등. 문제는 가져온 별칭에 대한 작업 메커니즘에 있습니다. 따라서 이러한 구성으로 작업 할 때 전체 경로를 지정해야합니다.
var_dump(class_exists('\Foo\Bar')); //true
var_dump(method_exists('\Foo\Bar', 'baz')); //true
$ref = 'Foo\Bar';
$obj = new $ref(); //ok
문제는 ( class_exists()
매뉴얼 페이지 사용자 노트 에서 언급했듯이 ) 클래스 이름이 문자열로 주어질 때마다 별칭이 고려되지 않는다는 것입니다. 이는 또한 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
'Nice programing' 카테고리의 다른 글
Maven : 공용 저장소에서 찾을 수없는 jar 포함 (0) | 2020.12.01 |
---|---|
git을 통해 svn-Branch를 삭제 하시겠습니까? (0) | 2020.12.01 |
dplyr로 여러 회귀 모델 피팅 (0) | 2020.11.30 |
Xcode 6 오류 : "포함 된 바이너리의 번들 식별자에 상위 앱의 번들 식별자가 접두사로 붙어 있지 않습니다." (0) | 2020.11.30 |
명령 줄에서 Maven 프로필 비활성화 (0) | 2020.11.30 |