이 글은 주로 require에 대한 자세한 설명과 PHP의 포함 경로 문제를 소개합니다. 매우 상세합니다. 필요한 친구는
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의 포함/요구 포함 메커니즘에서는 이 유형의 경로가 . require './a.php'와 require 'a.php'는 다릅니다!
세 가지 유형의 포함 경로 처리 방법을 분석해 보겠습니다. 먼저 결론을 기억하세요. 포함 경로가 상대 경로이거나 절대 경로인 경우 include_path(php.ini에 정의된 include_path 환경 변수)로 이동하지 않습니다. , 또는 프로그램에서
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에는 '../c.php'가 필요합니다. // 그러면 C=[SITE]/app/c.php는 [SITE ]/app/가 아닙니다. test/c.php
예 3
A는 require '../b.php'를 필요로 합니다. //그러면 B=[SITE]/app/b.php
B는 require '.. /c.php'를 필요로 합니다. //그러면 C=[SITE]/app/c.php는 [SITE]/c.php
가 아닙니다. 예 4:
A는 require '../b.php'를 정의했습니다. // 그러면 B=[SITE]; /app/b.php
B에는 './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 정의에는 '../inc/가 필요합니다. b.php'; // 그러면 B=[SITE]/app/inc/b.php
B의 정의는 './c.php'를 필요로 합니다. // 그러면 C=[SITE] /app/test/c.php 는 [SITE]/app/inc/c.php절대 경로는 비교적 간단하고 오류가 발생하기 쉽지 않으며 require|inclue는 디스크 문서에 해당합니다.
require '/wwwroot/xxx.com/app/test/b.php'; // Linux의 경우
require 'c:/wwwroot/xxx.com/app/test/b.php' // Windows의 경우
dirname
(FILE)도 절대 경로 형태의 디렉터리로 계산되지만 FILE은 매직 상수이며 이는 이 명령문이 작성된 PHP 파일의 절대 경로와 동일하다는 점에 유의해야 합니다. time이므로 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는 require를 정의합니다. dirname(FILE).'/c.php'; // 그러면 B=[SITE]/app/inc/c.php는 항상 B와 같은 디렉토리에 있습니다.
결론: A에 B가 포함되어 있어도 사용하지 않으면 됩니다. 직접 접속B如果 require dirname(FILE).'/c.php'; // 则始终引用到跟B在同一个目录中的 c.php文件;
B如果 require dirname(FILE).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件;
B如果 require dirname(FILE).'/c/c.php'; // 则始终引用到B文件所在目录的c子目录中的 c.php文件;
4. 未确定路径
首先在逐一用include_path中定义的包含目录来拼接[未确定路径],找到存在的文件则包含成功退出,如果没有找到,则用执行require语句的php文件所在目录来拼接[未确定路径]组成的全路径去查找该文件,如果文件存在则包含成功退出,否则表示包含文件不存在,出错。 未确定路径比较容易搞混不建议使用。
5. 解决方案
由于“相对路径”中的“参照目录”是执行入口文件所在目录,“未确定”路径也比较容易混淆,因此最好的解决方法是使用“绝对路径”; 例如b.php的内容如下,无论在哪里require b.php都是以b.php的路径为参照来require c.php的
$dir = dirname(FILE);
require($dir . '../c.php');
或者定义一个通用函数 import.php,将其设置为“自动提前引入文件”,在php.ini做如下配置
更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"
更改配置项(可选)allow_url_include = On
import.php内容如下
代码如下:
function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(FILE)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录” }
这样就可以使用import()函数来require文件了,无论包含多少级“参照目录”都是当前文件
위 내용은 PHP의 필수 및 포함 경로 문제에 대한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!