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

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

黄舟
黄舟원래의
2017-06-25 11:11:151945검색

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

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

9df0f60ff029f8eb81b55e01a56a1a47

살펴보겠습니다. 폴더_a/folder_a_a.php 파일 내용:

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

9bccfb58059bfa60a39df63e3660f792

마지막으로 폴더_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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