> 백엔드 개발 > PHP 튜토리얼 > PHP의 require_once 사용 및 상대 디렉터리에 주의하세요.

PHP의 require_once 사용 및 상대 디렉터리에 주의하세요.

黄舟
풀어 주다: 2023-03-11 12:08:01
원래의
1983명이 탐색했습니다.

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 &#39;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 파일의 내용을 살펴보겠습니다.

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

클래스 X{

함수 printInfo(){

                     echo 'success;

                                           이유

include 파일

:file_b_a.php

을 찾을 수 없습니다. 하지만 dirname(FILE)을 추가하면.'/'

모든 require_once()에 적용하면 file_a_a.php를 실행하든 index.php를 실행하든 관계없이 출력이 정상이 될 수 있습니다

************************ ******************************** ********

문제:

처음으로 상대경로를 사용해서 반복해서 포함시키니 오류가 났습니다

그리고 두 번째는 절대경로를 사용해서 오류가 나지 않았지만 그래도 조금 헷갈립니다.

먼저 다음과 같은 이유를 분석해봤습니다. 상대 경로를 사용할 때 발생하는 오류:

index.php를 실행하면 폴더_a 디렉터리를 찾을 수 있고 해당 디렉터리에서 file_a_a.php도 찾을 수 있으므로 폴더_a를 넣습니다. /file_a_a.php의 내용이 첫 번째 줄에 복사됩니다. index.php(문이 포함된 줄)를 실행한 후 계속 실행됩니다(즉, 포함된 내용이 실행됩니다). 따라서 이는 index.php require_once('../folder_b/file_b_a.php에서 file_a_a를 실행하는 것과 동일합니다. '); .php에서는 index.php의 현재 위치를 기준으로 이 경로 파일(file_b_a.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).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>
로그인 후 복사

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

<?php
     require_once(dirname(FILE).&#39;/&#39;."../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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿