2011-03-17 5 views
7

외부 라이브러리를 사용하려고합니다. 내가 네임 스페이스를 (PHP 5.3)를 사용하고 약간의 충돌이 있기 때문에PHP 네임 스페이스 문제가 발생했습니다.

문제는이 라이브러리 내부에

(바로 상단에 네임 스페이스를 추가) 모두에서 외부 라이브러리를 변경하지 않는 목표

  • is_a($obj,'3thpartyclassname') 작동하지 않는 몇 가지 상황이 내가 3thpartyclassname 앞에 네임 스페이스를 추가하는 경우에만 작동
  • new \Exception합니다 (제 3 회 당사자는 기본 클래스를 사용하지만 글로벌 공간을 apped 경우 그들은 단지 작동하지 않습니다)

이 수정 작업을 수행하는 방법은 없습니까?

업데이트 예외로 \ 예외를 사용하십시오. 문제 2 수정

나는 is_a와 is_subclass_of에만 문제가있다. 둘 다 네임 스페이스가 필요하고 현재 네임 스페이스를 무시합니다.

답변

12

아니, 당신은 몇 가지 제품 변형 is_ais_subclass_of 방법 (네임 스페이스 포함) 정규화 된 클래스 명에 넣어하도록 요구

namespace My\Own\Namespace;    // declare your own namespace 
use My\ThirdParty\Component;    // import 3rd party namespace 
$component = new Component;    // create instance of it 
var_dump(is_a($component, 'Component')); // FALSE 
var_dump($component instanceof Component); // TRUE 

을해야한다. 필자가 아는 한, PHP 5.3.5부터는 그럴 수있는 방법이 없다. instanceof을 사용하면 두베이스를 모두 해결할 수 있습니다.

Exception과 같은 네이티브 클래스 가져 오기가 작동해야합니다.

namespace My\Own\Namespace; 
use \Exception as Exception; 
throw new Exception('something broke'); 

자세한 내용은 chapter on Namespace in the PHP Manual을 참조하십시오.

0

is_a()가 상대 네임 스페이스 (현재 네임 스페이스 또는 use 명령으로 가져온 네임 스페이스)를 존중할 수있는 방법이 없다고 생각합니다. 이는 문자열 인수를 사용하여 다른 컨텍스트에서 실행되기 때문입니다. 대신 instanceof 구문으로 전환해야합니다. 아니요, 이것이 이것이 네임 스페이스에 대해 작성된 라이브러리 간의 충돌을 피하는 데 도움이된다고 생각하지는 않습니다. 그래도이 같은 인스턴스를 찾아 직접 처리해야합니다.

관련 문제