2012-08-14 4 views
3

spl_autoload, 네임 스페이스 및 동적 클래스 이름을 실험하는 동안 "이상한"일이 발생했습니다. PHP 5.3.2를 사용합니다. 자동로드를 다음과 같이 호출하십시오.PHP 네임 스페이스와 동적 클래스 이름

set_include_path(get_include_path().PATH_SEPARATOR."classes".PATH_SEPARATOR."utils"); 
spl_autoload_extensions(".class.php"); 
spl_autoload_register(); 

이제 코어를 사용하십시오. 코드를 다음과 같은 제안이 잘 작동

new \User\Student; 
$name="\User\Student"; 
new $name(); 

, 파일 클래스/사용자/student.class.php가 성공적으로로드됩니다, 모두 구조 성공. 그러나 조금 다른 사용법 :

$name="\User\Student"; 
new $name(); 
new \User\Student; 

"..Class \ User \ Student로드 할 수 없습니다 ..."에서 실패합니다. 어떻게 든 정적/동적 네임 스페이스 해상도와 관련되어야한다고 제안합니다. 그러나, 나는 그들이 처리되는 시간 (컴파일과 런타임)을 제외하고는이 두 가지 사이에 어떤 차이가 있어야한다고 생각하지 않는다.

설명해 주셔서 감사합니다.

+2

문자열에서 선행 백 슬래시를 제거하십시오. 동적 클래스 이름은 항상 정규화되어 있으므로 백 슬래시를 추가하는 것은 바람직하지 않습니다. – NikiC

답변

4

"문제"는 실제로 SPL보다 낮은 수준이며 __autoload()으로 볼 수도 있습니다. 이것은, 코드에서 설명된다 : 때 네임 스페이스를 소개 할 때 정적으로 호출 할 때, 선두 슬래시가 함수에 전달되지 않고 동적으로 호출 될 때 그것이 얼마나

function __autoload ($class) { 
    echo "Loading $class\n"; 
} 

new Test; 
// displays "Loading Test" 

$var = 'Test'; 
new $var; 
// displays "Loading Test" 

// However, when we introduce namespaces... 

new \This\Is\A\Test; 
// displays "Loading This\Is\A\Test" 

$var = '\This\Is\A\Test'; 
new $var; 
// displays "Loading \This\Is\A\Test" 

알 수 있습니다.

이 솔루션은 이러한 매우 간단한 일 중 하나를 수행하는 것이다 :

  • 동적 클래스 이름 인스턴스에서 선도적 인 슬래시를 제거합니다.
  • spl_autoload() 기능과 같은 기본 :
물론
set_include_path(get_include_path().PATH_SEPARATOR."classes".PATH_SEPARATOR."utils"); 
spl_autoload_extensions(".class.php"); 
spl_autoload_register(function($class) { 
    spl_autoload(ltrim($class, '\\')); 
}); 

당신이이 일을하는 경우, 당신은 또한 spl_autoload_extensions()에 전화를 제거하고 단지 spl_autoload()

의 두 번째 인수에 ".class.php" 문자열을 전달할 수