2014-12-14 6 views
-1

파일을 상대적으로 포함하는 데 몇 가지 문제가 있습니다. 문제는 require_once가 파일을 찾을 수 없다는 것이 아니라 파일이없는 곳에서 파일을 찾을 수 있다는 사실입니다. 문제를 세 개의 작은 클래스에서 제거했습니다.php require_once는 작업 디렉토리 대신 파일에 상대적인 파일을 포함합니다.

public_html/ 
    index.php 
    commands/ 
     CommandFactory.php 
     account/ 
      Status.php 

의 index.php :

require_once 'commands/CommandFactory.php'; 

$factory = new CommandFactory(); 

CommandFactory.php : 나는 다른에 CommandFactory를 이동하여 테스트 한

class CommandFactory{ 

    public function __construct() 
    { 
     echo getcwd() . '<br/>'; //xxx\public_html (which is good, this is where index.php is 
     //require_once 'account/Status.php'; // This works as expected 
     require_once 'account/Status.php'; // This ALSO works, but it shouldn't 

     $status = new Status(); // This works, though it shouldn't. 
    } 
} 

그래서이 내 디렉토리 구조입니다 dir, 문제를 해결합니다. 그러나 파일을 포함시킬 수있는 이유를 이해할 수 없습니다. 그것은 CommandFactory의 상대적인 Status를 포함해서는 안되며, index.php로부터 상대적이어야합니다. 나는 현재 작업 디렉토리를 추가하여 어떤 일이 잘못되는지 알아 보았지만 알아낼 수는 없습니다. 어떻게 그리고 왜 이것이 효과가 있는지 아는 사람이 있습니까? php.net 사이트에서

+0

을 방출 할 필요는 다른 행동을한다? – David

+0

경로를 현재 파일에 상대적으로 요구하면. 색인이 아니라 어쨌든 클래스 안에있는 파일을 포함하는 것은 실제로 좋은 습관이 아닙니다. 클래스를 자동로드해야합니다. – DarkBee

+0

"필요한 경우 경로는 현재 파일과 관련이 있습니다." 이것은 올바르지 않습니다. "그리고 OOP에서 내가 뭘하는지 알았고, 현재 파일과 관련이 있다면"명령/계정/Status.php "도 작동합니까? – David

답변

1

:

파일이 하나도 지정하지 않으면, 주어진 또는 파일 경로에 따라 포함되어 include_path를 지정. 파일이 include_path에 없으면 include 전에 호출 스크립트 자체의 디렉토리와 현재 작업 디렉토리를 확인한 다음 실패합니다. include 구문은 파일을 찾을 수없는 경우 경고를 내 보냅니다. 이 내 질문을 downvoted 한 이유를 설명 할 수 치명적인 오류

source

+0

감사합니다 :) 하하는 차라리 더 엄격하다고 생각합니다. – David

+0

문제 없습니다. 나는 모든 include/require하기 전에 __DIR__을 두는 것을 좋아한다. – DarkBee

+0

글쎄, __DIR__ 때문에 exaclty 나는 PHP가 상대 경로를 기준으로 클래스를 포함하지 않았다고 생각했다. 하지만 php.net 경향이 있어야합니다. – David