wwwroot //웹사이트 루트 디렉터리의 절대 경로: F:/wwwroot
--folder_a //폴더 A
file_a_a.php file_a_b.php file_a_c.php
--folder_b //폴더 B
file_b_a.php file_b_b.php file_b_c.php
-- index.php
*** * ************************************************* ** *******
이 디렉터리 계층 구조는 이미 매우 명확합니다.
wwwroot는 루트 디렉터리이고 그 아래에는 index.php 파일과 두 개의 폴더가 있습니다. 3 php 파일
먼저 index.php 파일의 내용을 살펴보세요:
<?php require_once("folder_a/file_a_a.php"); echo "文件folder_a_a.php被包含成功"; ?>
그런 다음 폴더_a/folder_a_a.php 파일의 내용을 살펴보세요:
<?php require_once("../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
마지막으로 폴더_b/folder_b_a.php의 내용을 살펴보겠습니다. 파일:
<?php class X{ function printInfo(){ echo 'success; } } ?>
Yiju Tutorial Network >
Php tutorial>>FAQ >php require_once 사용 및 상대 디렉토리는 주의해서 사용해야 합니다
www.111cn.net 업데이트: 2012-06-25 Editor: xiewen Source: Reprint
기사 소개 PHP 개발에서 누구나 자주 접하게 되는 require_once 사용법을 설명한 글입니다.
wwwroot //웹사이트 루트 디렉터리의 절대 경로는 다음과 같습니다: F:/wwwroot
--folder_a // 폴더 A
file_a_a.php
file_a_b.php
file_a_c.php
--folder_b // 폴더 B
file_b_a.php
file_b_b.php
file_b_c.php
-- index.php
************************ * ************************************
이 디렉터리 계층 구조는 이미 매우 명확합니다.
wwwroot 루트 디렉터리에는 index.php 파일이 있고 아래에 폴더_a와 폴더_b가 있습니다.
이 두 폴더에는 각각 3개의 PHP 파일이 있습니다.
먼저 index.php 파일의 내용을 살펴보겠습니다.
코드는 다음과 같습니다. 다음 코드 복사
require_once("folder_a/file_a_a.php");
echo "folder_a_a.php 파일이 성공적으로 포함되었습니다.";
?>
살펴보겠습니다. 폴더_a/folder_a_a.php 파일 내용:
코드는 다음과 같습니다. 코드 복사
require_once("../folder_b/file_b_a.php");
$x = new X() ;
$x.printInfo();
? >
마지막으로 폴더_b/folder_b_a.php 파일의 내용을 살펴보겠습니다.
코드는 다음과 같습니다. 코드 복사
php
클래스 X{
함수 printInfo(){
echo 'success;
이유include 파일
:file_b_a.php을 찾을 수 없습니다. 하지만 dirname(FILE)을 추가하면.'/' 모든 require_once()에 적용하면 file_a_a.php를 실행하든 index.php를 실행하든 관계없이 출력이 정상이 될 수 있습니다************************ ******************************** ********문제:처음으로 상대경로를 사용해서 반복해서 포함시키니 오류가 났습니다그리고 두 번째는 절대경로를 사용해서 오류가 나지 않았지만 그래도 조금 헷갈립니다.먼저 다음과 같은 이유를 분석해봤습니다. 상대 경로를 사용할 때 발생하는 오류: 그런데 사용해보면 똑같지 않나? 그런데 왜 잘못되지 않을까요? 아마도 모두가 이 문장에 대해 조금 혼란스러워할 것입니다. (프로그램의 실행 순서에 따라) 프로그램은 index first .php를 실행합니다. 이때 dirname(FILE)을 추가했으므로 현재는 절대 경로입니다.) index.php는 먼저 코드의 첫 번째 줄을 실행합니다: require_once(dirname(FILE).'/'.'folder_a/file_a_a.php' );dirname(FILE)은 f:/wwwroot/이므로 이 코드에 포함된 경로는 다음과 같습니다.f:/wwwroot/folder_a/file_a_a.php이 경로는 정확하므로 문제가 없습니다. ok 첫 번째 단계가 올바르게 완료되었습니다그런 다음 file_a_a.php의 코드를 index.php의 이 위치에 복사합니다.그런 다음 계속 실행됩니다. 이는 index.php의 file_a_a를 실행하는 것입니다. , 그럼 어떤 코드가 실행되는지 살펴볼까요?
<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); ?>
对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:
<?php require_once(dirname(FILE).'/'."../folder_b/file_b_a.php"); $x = new X(); $x.printInfo(); echo "文件folder_a_a.php被包含成功"; ?>
我们来看个注意事项
假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo
c.php require_once("a.php"); require_once("demo/b.php"); B::demo();a.php class A { }
b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了
require_once("../a.php"); class B extends A { public static function demo() { echo "xx"; } }
执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于
require_once("a.php"); require_once("../a.php"); class B extends A { public static function demo() { echo "xx"; } } B::demo();
原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。
require_once很简单用但在使用时大家尽量使用绝对路径了。
위 내용은 PHP의 require_once 사용 및 상대 디렉터리에 주의하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!