2017-01-24 7 views
0

자동 로딩에 PSR-0을 사용하고 있습니다. PSR-4를 사용해야합니다. PSR-4를 사용해도 답변을 환영합니다.PHP 자동로드에서 오류가 발생했습니다

자동 로딩이 제대로 작동하는 다음 디렉토리 구조가 있습니다. 다음 디렉토리 구조에 대한

+ www/entity 
|__ /EntityGenerator 
|  |__ /Database 
|  |  |__ DatabaseConnection 
|  |  |__ DatabaseConnectionInterface 
|  |  |__ DatabaseRepositoryInterface 
|  |  
|  |__ /Exception 
| 
|__ autoload.php 
|__ index.php 

의 다음과 같은 오류를 제공

경고 : 스트림을 열지 못했습니다 : C에서 해당 파일이나 디렉토리 : (EntityGenerator \의 DatabaseConnection.php는 \ 데이터베이스)가 필요합니다 \ WAMP 내가 두 번째 디렉토리 구조와 오류가있는 이유 \ 선 (15)

+ www/entity 
| __ /EntityGenerator 
     |__ /Database 
     |  |__ DatabaseConnection 
     |  |__ DatabaseConnectionInterface 
     |  |__ DatabaseRepositoryInterface 
     |  
     |__ /Exception 
     |__ autoload.php 
     |__ index.php 

에 www가 \ 엔티티 \ EntityGenerator \ autoload.php는 사람이 설명 할 수 있습니다. 사람이 테스트를 위해 전체 코드를 필요로하는 경우

, 그것은 디렉토리 구조 때문입니다 아래의 링크

https://github.com/channaveer/EntityGenerator

+0

당신은 전체 코드에 연결되어 있지 않습니다. ** 귀하의 질문에 ** 관련 코드 **를 포함시켜야합니다. 가장 주목할만한 것은 : autoload.php를 보면 매우 도움이 될 것입니다. –

+0

@Franz 사실 나는 그것을 위해 계획을 세웠지 만 때로는 실제로 다른 사람들이 내 코드 링크를 추가하기 위해 생각한 것을 혼란스럽게 할 수도 있습니다. 어쨌든 앞으로는 오픈 소스가 될 것입니다. 감사. –

+1

나만인가, 아니면 자동 로딩 할 때 상대 경로 만 사용합니까? 그렇다면 큰 일은 아닙니다. – apokryfos

답변

1

현재 스크립트의 디렉토리로 설정되지 않은 상대 경로를 사용하고 있습니다. 로드해야하는 것을로드하려면 절대 경로를 사용해야합니다.

function autoload($className) 
{ 
    $namespaceRoot = "EntityGenerator"; 
    $className = ltrim($className, '\\'); 
    if (strpos($className,$namespaceRoot) !== 0) { return; } //Not handling other namespaces 
    $className = substr($className, strlen($namespaceRoot)); 
    $fileName = ''; 
    $namespace = ''; 
    if ($lastNsPos = strrpos($className, '\\')) { 
     $namespace = substr($className, 0, $lastNsPos); 
     $className = substr($className, $lastNsPos + 1); 
     $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
    } 
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 
    require __DIR__.DIRECTORY_SEPARATOR.$fileName; //absolute path now 
} 
spl_autoload_register('autoload'); 

__DIR__은 현재 스크립트가있는 디렉토리를 반환 보장됩니다.

+0

자동로드 "C : \ wamp \ www \ entity \ EntityGenerator \ EntityGenerator \ Database \ DatabaseConnection.php"에 에코를 넣었을 때 변경을 시도하고 다음을 얻었습니다. 심지어 지금도 2 구조와 동일한 문제. 오류는 다음과 같습니다. "경고 : (C : \ wamp \ www \ entity \ EntityGenerator \ EntityGenerator \ Database \ DatabaseConnection.php) 필요 : 스트림을 열지 못했습니다." 그걸 도와 주실 수 있겠습니까? –

+0

@ChannaveerHakari 문제는 오토로더를 네임 스페이스 내부로 옮겼다는 것입니다. 일반적으로 자동 로더는 이름 공간 외부에 있습니다. 그러나 당신은 루트 네임 스페이스를 지정함으로써 그 문제를 해결할 수 있습니다. 이미 업데이트 된 코드를 확인하십시오. – apokryfos

+0

감사합니다. 다른 방법을 알고 싶었습니다.당신의 대답이 나를 분명하게 만들었습니다 –

1

를 찾아주십시오. EntityGenerator \ Database \ DatabaseConnection을로드하려고합니다. 첫 번째 예제에서는 경로와 일치하지만 두 번째 예제에서는 그렇지 않습니다. 그냥 autoload.php에서 경로를보세요. 경로에서 경로를 찾고 있습니다. EntityGenerator는 autoload.php의 경로 인 www/entity의 유효한 경로입니다. 하지만 두 번째 예제에서는 www/entity/EntityGenerator가 아닙니다.

+0

자동 로딩 기능에서 경로가 ** 에코 **되면 두 디렉토리 구조가 모두 같은 경로를 나타냅니다. 그것에 대해 당신의 의견은 뭐죠? –

+0

경로가 맞아야합니다.하지만 autoload.php가 autoload.php의 경로 인 www/entity/EntityGenerator에 EntityGenerator 경로가 없기 때문에 autoload.php가 두 번째 예에서 해당 경로에 액세스 할 수 없습니다. 두 번째 예제에서 autoload.php 근처에 파일을 놓고 "echo"에서 얻은 경로가 필요합니다. 무엇이 잘못되었는지 보게 될 것입니다. 가능한 경우 require/include에 절대 경로를 사용하십시오. –