programing

include 또는 include_once 문에 dirname(_FILE__)을 사용하는 이유는 무엇입니까?

elecom 2023. 10. 25. 22:33
반응형

include 또는 include_once 문에 dirname(_FILE__)을 사용하는 이유는 무엇입니까?

나는 이것을 본 적이 있습니다.

<?php
  include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php');
?>

내가 왜 이런 일을 해야 합니까?내가 왜 dir name을 구하고 디렉토리 구분자와 새 파일 이름을 연결하는 수고를 해야 합니까?

위의 코드가 이와 동등하지 않습니까?

<?php
  include( 'my_file.php' );
?>

??

PHP 문서에 의하면,

파일은 주어진 파일 경로를 기반으로 포함되거나 주어진 파일 경로가 없는 경우 include_path가 지정됩니다.include_path에서 파일을 찾을 수 없는 경우 include()는 실패하기 전에 호출 스크립트의 디렉토리와 현재 작업 디렉토리를 최종적으로 체크인합니다.include() construct는 파일을 찾을 수 없으면 경고를 표시하며, 이는 치명적인 오류를 표시하는 require()와 다른 동작입니다.

제가 다음과 같은 (가짜) 디렉토리 구조를 가지고 있다고 가정해 보겠습니다.

.../root/
        /app
            bootstrap.php
        /scripts
            something/
                somescript.php
        /public
            index.php

이제 가정해 보겠습니다.bootstrap.php데이터베이스 연결 설정을 위한 코드나 다른 종류의 부스트 래핑 같은 것이 포함되어 있습니다.

에 파일을 포함시키겠다고 가정합니다.boostrap.php의 폴더를 호출했습니다.init.php. 이제 전체 포함 경로를 스캔하지 않으려면 다음과 같이include 'init.php', 당신은 사용할 수 있습니다.include './init.php'.

그런데 문제가 있습니다.../포함된 스크립트와 관련이 있을 것입니다.bootstrap.php,것은 아니다.bootstrap.php (기술적으로 말하면 작업 디렉토리와 상대적일 것입니다.)

dirname(__FILE__)작업 디렉토리가 해당 디렉토리인 것에 의존하지 않고 절대 경로를 가져올 수 있습니다(따라서 포함 경로 검색을 피할 수 있습니다).bootstrap.php상주합니다.

(참고: PHP 5.3 이후로 사용할 수 있습니다.__DIR__대신에dirname(__FILE__).)

자, 왜 그냥 사용하지 않습니까?'init.php';?

처음엔 이상하긴 했지만,.포함 경로에 있음을 보장하지 않습니다.가끔은 쓸모없는 것을 피하기 위해stat()사용자는 동일한 디렉토리에 파일을 포함하는 경우가 거의 없을 때 해당 파일을 포함 경로에서 제거합니다(포함되지 않을 것임을 알 때 현재 디렉토리를 검색하는 이유는 무엇입니까?).

참고: 이 답변의 약 절반은 오래된 게시물의 주소입니다.필요한 것(dirname(_FILE__)'/'.'.'.myParent.php')만 필요한 것('myParent.php')보다 더 나은 것은 무엇입니까?

승인된 답변에 비해 이 질문에 대해 더 간단한 설명이 있을 수 있으므로 한 번 시도해 보겠습니다. 프로젝트의 파일 및 디렉토리 구조가 다음과 같다고 가정해 보겠습니다.

Project root directory:
                       file1.php
                       file3.php
                       dir1/
                            file2.php

(dir1는 디렉토리이고.file2.php안에 있음)

그리고 이것은 위의 세 개의 파일 각각의 내용입니다.

//file1.php:
<?php include "dir1/file2.php"

//file2.php:
<?php include "../file3.php"

//file3.php:
<?php echo "Hello, Test!";

지금 실행file1.php무슨 일이 일어날지 알아맞혀 보세요"Hello, Test!"를 기대할 수도 있지만, 그것은 보여지지 않을 것입니다.대신 요청한 파일()을 나타내는 오류가 표시됩니다.file3.php이 존재하지 않습니다!

그 이유는 안에file1.php포함하면file2.php, 그것의 내용은 복사되고 바로 다시 붙여집니다.file1.php루트 디렉터리 내부에 있으므로 이 부분."../file3.php" 루트 디렉터리에서 실행되므로 하나의 디렉터리가 루트 디렉터리 위로 이동합니다. (그리고 분명히 다음을 찾을 수 없습니다.)file3.php).

자, 이제 어떻게 할까요?

상대 경로는 물론 위와 같은 문제가 있기 때문에 절대 경로를 사용해야 합니다.하지만 절대 경로에도 한 가지 문제점이 있습니다.루트 폴더(예를 들어 전체 프로젝트를 포함)를 복사하여 컴퓨터의 다른 곳에 붙여넣으면 그 시점부터 경로가 유효하지 않게 됩니다!정말 엉망진창이 되겠군요!

따라서 우리는 절대적이면서 동적인 경로가 필요합니다(각 파일은 어디에 있든 동적으로 자신의 절대 경로를 찾습니다)!

우리가 그렇게 하는 방법은 PHP의 도움을 받는 것이고,dirname()는 파일이 존재하는 디렉터리에 대한 절대 경로를 제공하는 함수입니다.그리고 각각의 파일명은 또한 쉽게 접근할 수 있었습니다.__FILE__일정한. 그래서.dirname(__FILE__)위의 코드를 입력하는 파일에 대한 절대 경로(동적인 경우)를 쉽게 제공할 수 있습니다.이제 전체 프로젝트를 새로운 장소로 옮기거나 새로운 시스템으로 옮기십시오. 그러면 tada! 효과가 있습니다!

이제 위의 프로젝트를 다음과 같이 하면 됩니다.

//file1.php:
<?php include(dirname(__FILE__)."/dir1/file2.php");

//file2.php:
<?php include(dirname(__FILE__)."/../file3.php");

//file3.php:
<?php echo "Hello, Test!";

그걸 실행하면 전능하신 분을 보게 될 겁니다Hello, Test! (hopefully, 다른 잘못을 하지 않았다면)

PHP5에서 더 좋은 방법이 있다는 것도 언급할 가치가 있습니다. (가독성과 눈부심 방지와 관련해서!)PHP에 의해서도 제공이 되었는데, 그것은 상수입니다.__DIR__그 일은 우리가 할 수 있는 일과 똑같습니다.dirname(__FILE__)!

도움이 되길 바랍니다.

이것이 당신의 생각이라면 저는 아래에 이것을 사용했습니다.저한테는 잘 통했어요.

<?php
    include $_SERVER['DOCUMENT_ROOT']."/head_lib.php";
?>

제가 하려고 했던 것은 /head_lib라는 파일을 꺼내는 것이었습니다.루트 폴더에서 php.웹 페이지를 만드는 데 아무 것도 끌지 못할 것입니다.머리글, 바닥글 및 기타 하위 디렉토리의 주요 기능은 결코 나타나지 않습니다.내가 위에서 하기 전까지는 챔피언처럼 작동했습니다.

다른 환경의 여러 서버에서 코드를 실행하려면 include_once 문에 dirname(FILE)을 사용해야 합니다.이유는 다음과 같습니다. 1. 서버에 파일을 포함하는 절대 경로를 주지 마십시오. 2. 전체 경로를 절대 경로처럼 동적으로 계산합니다.

'/myfile.php'의 집에 도착할 때까지 dirname(FILE)과 이후 호출을 함께 사용합니다.그런 다음 경로를 포함한 이 변수를 포함한 파일에 첨부합니다.

언급URL : https://stackoverflow.com/questions/9628443/why-would-i-use-dirname-file-in-an-include-or-include-once-statement

반응형