2016-06-02 10 views
1

매우 간단하게 처리해야하므로 다소 혼란 스럽습니다.호출자와 동일한 네임 스페이스에있는 클래스에 대해 클래스를 찾을 수 없음 오류

I의 구조는 다음과 같습니다

클래스 X :

namespace A; 
use \B\Y; 

class X 
{ 
    public function __construct() 
    { 
     $y = new Y(); 
    } 
} 

클래스 Y :

namespace B; 

class Y 
{ 
    public function __construct() 
    { 
     $z = new Z(); 
    } 
} 

클래스 Z :

namespace B; 

class Z 
{ 
    public function __construct() 
    { 
     ... 
    } 
} 

주요 프로그램 :

namespace A; 

$x = new X(); 

당신이 볼 수 있듯이 클래스 A는 (주 프로그램과 동일하다) 다른 네임 스페이스에있는 동안, 클래스 Y 및 Z는 같은 네임 스페이스에있는

이 주 프로그램을 실행하려고하면 오류 메시지 PHP Fatal error: Class 'Z' not found이 표시됩니다.

프로그램을 디버그하고 오토로더 안에 중단 점을 넣으면 클래스 Y가 \ B \ Y로로드되지만 클래스 Z가 네임 스페이스 한정자없이로드되는 것을 볼 수 있습니다 (다른 클래스에서 사용 중입니다). 동일한 네임 스페이스에서). 문제는 클래스 Z가 네임 스페이스 한정자없이로드되는 이유는 무엇입니까?

나는 namespace 한정자없이 서로 참조하는 네임 스페이스 B에 꽤 많은 클래스를 가지고 있습니다. 그리고 모두를 변경하는 것은 아주 힘들지 만 불가능하지는 않습니다.

+0

예에서 클래스'Z'는 실제로'Y'라고합니다. 나는 (고정 클래스 Z로) 샘플을 테스트했고 기본 자동로드 기능으로 잘 작동하는 것 같다. – Pieter

+0

@Pieter 그래, Z 복사/붙여 넣기 오류 야. 그렇다면 오토로더에서 왜 프로젝트 고유의 문제를 다루는 커스텀 오토로더 (custom autoloader)라고 생각합니까? 요청 된 클래스 이름에는 네임 스페이스가 없습니다. –

+0

실제 오토로더 코드를 제공하지 않으면 말할 수 없습니다. 이 오토로더를 사용하면 다음과 같이 작동합니다 :'($ class) {require_once __DIR__. '/'. 프로젝트 구조와 함께 PSR-0을 사용하십시오). – Pieter

답변

0

실제로 매우 흥미 롭습니다. 내가 찾은 것은 이것이었다. 내 경우에는, 클래스의 이름이 같은 외부 소스에서 뭔가 읽기 :

$className = "Segment_" . $element->getName(); 
$segment = new $className(); 

오토로더를 강화하면 클래스가 발견되지 않았 음을 불평, 실패, 보여 주었다 클래스 존재 요청한 네임 스페이스가 없습니다. 이 코드를 다음 코드로 변경했습니다.

$className = __NAMESPACE__ . "\Segment_" . $element->getName(); 
$segment = new $className(); 

그리고이 문제가 없습니다.

동적 클래스 이름의 경우 PHP가 현재 네임 스페이스를 추가하지 않았으므로 수동으로 추가해야했습니다.