>  기사  >  백엔드 개발  >  PHP_php 팁의 필수 및 포함 경로 문제에 대한 자세한 설명

PHP_php 팁의 필수 및 포함 경로 문제에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 20:27:071056검색

1 절대 경로, 상대 경로, 미결정 경로

상대 경로

상대 경로는

과 같이 .로 시작하는 경로를 나타냅니다.

코드 복사 코드는 다음과 같습니다.

./a/a.php (현재 디렉토리 기준)
../common.inc.php (상위 디렉토리 기준),

절대 경로

절대 경로는 Windows에서 /로 시작하는 경로 또는 C:/와 유사한 드라이브 문자입니다. 전체 경로는 참조 경로 없이 파일의 최종 주소를 고유하게 결정할 수 있습니다. 예를 들어

코드 복사 코드는 다음과 같습니다.

/apache/wwwroot/site/a/a.php
c:/wwwroot/site/a/a.php

경로를 알 수 없음

Windows에서 . 또는 /로 시작하지 않거나 드라이브 문자:/로 시작하지 않는 경로(예:

)

코드 복사 코드는 다음과 같습니다.

a/a.php
common.inc.php,

처음에는 이것도 상대 경로인 줄 알았는데, PHP의 include/require 메커니즘에서는 이 유형의 경로가 로 시작하는 상대 경로와 완전히 다르게 처리됩니다. require './a.php'와 require 'a.php'는 다릅니다!

이 세 가지 유형의 포함 경로 처리 방법을 분석해 보겠습니다. 먼저 결론을 기억하십시오. 포함 경로가 상대 경로이거나 절대 경로인 경우 include_path(php.ini에 정의된 include_path 환경 변수)로 이동하지 않습니다. ini 또는 프로그램에서 파일을 찾으려면 set_include_path(...)를 사용하십시오.

테스트 환경 설명

참고: 다음 논의 및 결론은 이 환경을 기반으로 합니다. A=http://www.xxx.com/app/test/a.php를 가정합니다. 다음 논의는 다음의 경우에 해당한다는 점을 다시 강조합니다. A에 직접 액세스할 수 있습니다.

2. 상대 경로:
상대 경로에는 파일의 최종 경로를 결정하는 참조 디렉터리가 필요합니다. 포함 구문 분석에서는 포함 수준이 얼마나 많이 중첩되어 있는지에 관계없이 이 참조 디렉터리는 프로그램 실행 항목 파일이 있는 디렉터리입니다.

예시 1

A에 정의 require './b/b.php'; // 그러면 B=[SITE]/app/test/b/b.php
B에서 정의 require './c.php'; // 그러면 C=[SITE]/app/test/c.php는 [SITE]/app/test/b/c.php가 아닙니다

예시 2

A에 정의됨 require './b/b.php'; // 그러면 B=[SITE]/app/test/b/b.php
B에 정의 require '../c.php'; // 그러면 C=[SITE]/app/c.php는 [SITE]/app/test/c.php가 아닙니다

예시 3

A에 정의됨 require '../b.php'; //Then B=[SITE]/app/b.php
B에서 정의하면 '../c.php'가 필요합니다. //그러면 C=[SITE]/app/c.php는 [SITE]/c.php가 아닙니다

예 4:

A에 정의됨 require '../b.php'; // 그런 다음 B=[SITE]/app/b.php
B에 정의 require './c/c.php'; //그러면 C=[SITE]/app/test/c/c.php는 [SITE]/app/c/c.php가 아닙니다

예시 5

A에 정의됨 require '../inc/b.php'; // 그러면 B=[SITE]/app/inc/b.php
B에서 정의 require './c/c.php'; // 그런 다음 C는 여전히 =[SITE]/app/test/c/c.php가 아님 [SITE]/app/inc/c/c.php

예시 6

A에 정의 require '../inc/b.php'; // 그러면 B=[SITE]/app/inc/b.php
B에 정의 require './c.php'; // 그러면 C=[SITE]/app/test/c.php는 [SITE]/app/inc/c.php가 아닙니다

3.절대 경로

절대 경로는 상대적으로 단순하며 혼동과 오류를 일으킬 가능성이 적습니다. require|inclue는 디스크의 파일에 해당합니다.

require '/wwwroot/xxx.com/app/test/b.php' // Linux의 경우
require 'c:/wwwroot/xxx.com/app/test/b.php' // Windows에서
dirname(__FILE__)도 절대 경로 형태의 디렉터리로 계산되지만, __FILE__은 Magic 상수이므로 이 명령문이 언제든지 작성되는 php 파일의 절대 경로와 동일하다는 점에 유의해야 합니다. 따라서 dirname(__FILE__)도 항상 이 명령문이 작성된 PHP 파일의 절대 경로를 가리키며, 해당 파일이 다른 파일에 포함되어 사용되는지 여부와는 아무런 관련이 없습니다.

예시 1

A에 정의됨 require '../b.php'; // 그런 다음 B=[SITE]/app/b.php
B에서 정의 require dirname(__FILE__).'/c.php'; // 그러면 B=[SITE]/app/c.php

예시 2

A에 require '../inc/b.php'를 정의하고 // 그런 다음 B=[SITE]/app/inc/b.php
B에 정의 require dirname(__FILE__).'/c.php'; // 그러면 B=[SITE]/app/inc/c.php는 항상 B와 같은 디렉토리에 있습니다
결론: B가 A에 포함되어 사용되거나 직접 액세스되는 경우

B if require dirname(__FILE__).'/c.php'; // 항상 B와 동일한 디렉토리에 있는 c.php 파일을 참조합니다. B에 dirname(__FILE__).'/../c.php'가 필요한 경우 // 항상 B 파일이 있는 디렉터리의 상위 디렉터리에 있는 c.php 파일을 참조합니다. B에 dirname(__FILE__).'/c/c.php'가 필요한 경우 // 항상 B 파일이 있는 디렉토리의 c 하위 디렉토리에 있는 c.php 파일을 참조합니다.

4. 경로 미정

먼저, include_path에 정의된 include 디렉터리를 사용하여 [미확인 경로]를 하나씩 연결합니다. 기존 파일이 발견되면 include가 성공적으로 종료됩니다. 파일이 실행되는 디렉터리를 사용합니다. require 문은 파일을 검색하기 위해 splice [undetermined path] 에 위치합니다. 파일이 존재하면 성공적으로 종료됩니다. 그렇지 않으면 파일이 존재하지 않으며 오류가 발생합니다. 확인되지 않은 경로는 혼동되기 쉬우므로 권장되지 않습니다.

5. 해결 방법

"상대 경로"의 "참조 디렉터리"는 실행 항목 파일이 있는 디렉터리이므로 "결정되지 않은" 경로도 혼동하기 쉽기 때문에 가장 좋은 해결책은 "절대 경로"를 사용하는 것입니다. 예를 들어, b.php의 내용 아래와 같이 b.php가 필요한 위치에 관계없이 b.php의 경로는 c.php를 요구하는 참조로 사용됩니다.

$dir = 디렉토리 이름(__FILE__);

require($dir . '../c.php');

또는 import.php 일반 함수를 정의하고 "미리 자동으로 파일 가져오기"로 설정한 후 php.ini에서 다음과 같이 구성합니다

구성 항목 변경(필수) auto_prepend_file = "C:xampphtdocsauto_prepend_file.php"
구성항목 변경(선택) allowed_url_include = On

import.php 내용은 다음과 같습니다

코드 복사 코드는 다음과 같습니다.

함수 가져오기($path) {
$old_dir = getcwd(); // 원래 "참조 디렉터리" 저장
chdir(dirname(__FILE__)); // "참조 디렉터리"를 현재 스크립트의 절대 경로로 변경합니다.
​ require_once($path);
chdir($old_dir); // 원래 "참조 디렉터리"로 다시 변경
}

이런 방식으로 import() 함수를 사용하여 파일에 포함된 "참조 디렉터리"의 수준에 관계없이 해당 파일은 현재 파일입니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.