programing tip

PHP는 파일이나 호출 코드에 상대적인 경로를 포함합니까?

itbloger 2020. 8. 18. 07:26
반응형

PHP는 파일이나 호출 코드에 상대적인 경로를 포함합니까?


PHP 상대 포함 경로와 관련된 규칙 세트를 이해하는 데 문제가 있습니다. 파일 A.PHP-를 실행하고 파일 A.PHP에 파일 C.PHP를 포함하는 파일 B.PHP가 포함되어있는 경우 C.PHP의 상대 경로가 B.PHP의 위치 또는 A의 위치와 관련이 있어야합니다. .PHP? 즉, include가 어떤 파일 에서 호출되었는지, 아니면 현재 작업 디렉토리가 무엇이며 현재 작업 디렉토리를 결정하는 것이 중요합니까?


기본 스크립트 (이 경우 A.php)에 상대적입니다. 그 기억 include()은 현재 실행중인 스크립트에 바로 삽입 코드를.

즉, include가 호출되는 파일이 중요합니까?

아니.

당신이하려는 경우 확인 문제를, 그리고는 B.php를 기준으로 포함 할, 사용 __FILE__상수 (또는 __DIR__PHP 5.2 IIRC부터) 리터럴 현재 파일에 항상 점 코드의 라인에 위치하는 것이다.

include(dirname(__FILE__)."/C.PHP");

@Pekka가 저를 거기에 데려다 주었지만 제가 배운 것을 공유하고 싶습니다.

getcwd() 실행을 시작한 파일이있는 디렉토리를 반환합니다.

dirname(__FILE__) 현재 실행중인 코드를 포함하는 파일의 디렉토리를 반환합니다.

이 두 가지 함수를 사용하면 항상 필요한 항목과 관련된 포함 경로를 만들 수 있습니다.

예를 들어 b.php와 c.php가 디렉토리를 공유하는 경우 b.php는 다음과 같이 c.php를 포함 할 수 있습니다.

include(dirname(__FILE__).'/c.php');

b.php가 어디에서 호출 되든 상관 없습니다.

실제로 이것은 추가 코드가 대상 파일을 찾으려고 할 때 include_path를 반복 할 필요가 없도록 PHP를 해제하므로 상대 경로를 설정하는 선호되는 방법입니다.

출처 :

getcwd ()와 dirname (__ FILE__)의 차이점은 무엇입니까? 어느 것을 사용해야합니까?

dirname ( FILE ) 을 사용해야하는 이유


  1. 포함 경로가 ./또는로 시작하지 않는 경우 ../, 예 :

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
    
  2. 포함 경로가 ./또는 로 시작하는 경우 ../, 예 :

    include './C.php';  // relative to '.'
    
    include '../C.php'; // also relative to '.'
    

.또는 ..위가를 기준으로 getcwd()항목의 경로에있는 디폴트 .php파일 (예 A.php).

PHP 5.4.3 (빌드 날짜 : 2012 년 5 월 8 일 00:47:34)에서 테스트되었습니다.

(또한 chdir()의 출력을 변경할 수 있습니다 getcwd().)


Pekka의 허용 된 답변은 불완전하며 일반적인 맥락에서 오해의 소지가 있습니다. 파일이 상대 경로로 제공되는 경우 호출 된 언어 구문 include은 다음과 같은 방법 으로 파일 을 검색합니다.

먼저 환경 변수의 경로를 통과 include_path하며 ini_set. 이것이 실패하면 호출하는 스크립트의 자체 디렉토리 dirname(__FILE__)( __DIR__php> = 5.3 사용)에서 검색합니다. 이것도 실패하면 작업 디렉토리에서만 검색합니다! 기본적으로 환경 변수 include_path.현재 작업 디렉토리 인으로 시작합니다. 이것이 현재 작업 디렉토리에서 먼저 검색하는 유일한 이유입니다. http://php.net/manual/en/function.include.php를 참조 하십시오 .

파일은 주어진 파일 경로 또는 지정된 경로가 없으면 include_path를 기반으로 포함됩니다. include_path에서 파일을 찾을 수 없으면 include는 실패하기 전에 마지막으로 호출 스크립트의 자체 디렉토리와 현재 작업 디렉토리를 확인합니다.

따라서 질문의 첫 번째 부분에 대한 정답은 포함 된 호출 스크립트의 위치가 중요하다는 것입니다. 질문의 마지막 부분에 대한 대답은 웹 서버 컨텍스트에서 초기 작업 디렉토리가 PHP에 의해 처리되는 동안 다른 모든 것을 포함하는 스크립트 인 호출 된 스크립트의 디렉토리라는 것입니다. 명령 줄 컨텍스트에서 초기 작업 디렉토리는 프롬프트에서 php가 호출 될 때의 디렉토리이며 호출 된 스크립트가있는 디렉토리 일 필요는 없습니다. 그러나 현재 작업 디렉토리는 PHP 함수를 사용하여 런타임에 변경할 수 있습니다 chdir. http://php.net/manual/en/function.chdir.php를 참조 하십시오 .

이 단락은 다른 답변에 대한 의견을 추가합니다. 일부에 의존하는 것을 언급 한 include_path적은 강력하고 따라서 같은 전체 경로를 사용하는 것이 바람직하다 ./path또는 __DIR__ . /path. 어떤 사람들은 작업 디렉토리 .자체 에 의존하는 것은 변경 될 수 있기 때문에 안전하지 않다고 말했습니다. 그러나 때로는 환경 값에 의존해야합니다. 예를 들어, include_path호출하는 스크립트의 디렉토리가 현재 작업 디렉토리 이전에도 검색 할 첫 번째 위치가되도록 공백으로 설정할 수 있습니다 . 코드는 이미 외부 소스에서 정기적으로 작성 및 업데이트되었을 수 있으며 __DIR__코드가 업데이트 될 때마다 접두사를 다시 삽입하지 않으려 고합니다 .


짧은 대답 : 포함 스크립트와 관련이 있습니다.

TFM은이를 올바르게 설명합니다.

include_path에서 파일을 찾을 수없는 경우 include는 호출 스크립트의 디렉토리와 현재 작업 디렉토리를 확인합니다.

경우에 따라서, /app/main.php는 말한다 include("./inc.php")즉 찾을 수 /app/inc.php .

./는 꼭 필요하지 않지만의 include_path에 대한 종속성을 제거합니다.

누군가가 .NET Framework로 변경하는 경우 현재 작업 디렉토리에서 포함 파일을 찾는 데 의존하지 않습니다 chdir().


dir
-> a.php
-> c.php

- dir2 
-> b.php

포함하기 ab당신이 필요include("../a.php");

포함하기 bc당신이 필요include("dir2/b.php");

참고 URL : https://stackoverflow.com/questions/7378814/are-php-include-paths-relative-to-the-file-or-the-calling-code

반응형