과거 일부 PHP 프레임워크 소스 코드를 살펴보면 파일이 포함될 때 dirname(__FILE__)을 사용하여 파일 경로를 하나로 묶는 것이 이상했습니다. 그렇게 하면 어떤 이점이 있는지 알 수 없었습니다. , 그러나 마침내 그 이유를 발견했습니다.
간단한 예를 살펴보겠습니다.
php 파일 a, b, c 세 개가 있습니다. a.php는 웹사이트의 루트 디렉터리에 있고, b.php는 b 폴더(b/b.php)에 있으며, c.php는 c 폴더(c/c.php)에 있습니다. 약간의 혼란이 있나요? 사진을 보면 명확합니다:
a.php와 b.php는 모두 c.php를 포함하며, 마지막으로 c.php는 d 폴더에 d/d.php라는 PHP 파일을 포함합니다.
먼저 a.php를 살펴보겠습니다.
<?php $file_name = 'a.php'; echo "this is a.php"; echo "<hr>"; require('c/c.php'); ?>
이것은 인쇄 후 c/c.php를 포함하는 매우 간단한 코드입니다. 다음으로 c/c.php를 살펴보겠습니다.
<?php $c_file_name = 'c.php'; echo 'this is c.php, is required by ' . $file_name; echo "<hr>"; require('../d/d.php'); ?>
인쇄 출력 "이것은 c.php이고 a.php에 필요합니다.", $file_name은 a.php에 정의된 변수입니다. 마지막에는 d.php가 포함됩니다. d 폴더는 현재 c.php 파일보다 한 계층 위에 있기 때문에 상식적으로는 당연히 경로를 "../d/d.php"로 작성하겠습니다. 하지만 안타깝게도 오류가 보고됩니다. 그 이유는 c.php 등 포함된 파일에 다른 파일을 포함시킬 때 경로는 가장 바깥쪽 상위 파일, 즉 a.php를 기준으로 하므로 내가 포함시켰기 때문으로 이해될 수 있다. , 그러니 당신은 나에게 의지해야합니다. 매우 신비해 보이지만 사실 원리는 매우 간단합니다. require('c/c.php')를 c/c.php 파일의 코드로 생각하면 a.php가 다음과 같이 보일 수 있습니다. :
<?php $file_name = 'a.php'; echo "this is a.php"; echo "<hr>"; // require('c/c.php'); $c_file_name = 'c.php'; echo 'this is c.php, is required by ' . $file_name; echo "<hr>"; require('../d/d.php'); ?>
이 시점에서 d/d.php 파일을 포함하려고 할 때 경로가 지금 잘못되었음을 알 수 있습니다. 이제 우리는 a.php 코드에 있으므로 a.php 파일을 기준으로 합니다. 물론 경로는 require('d/d.php')여야 합니다. 맞습니다. 코드를 다음과 같이 수정합니다.
<?php $file_name = 'a.php'; echo "this is a.php"; echo "<hr>"; // require('c/c.php'); $c_file_name = 'c.php'; echo 'this is c.php, is required by ' . $file_name; echo "<hr>"; require('d/d.php'); ?>
이 시점에서는 아직 의미를 이해하지 못했기 때문에 아래를 살펴보겠습니다. b/b.php:
<?php $file_name = 'b.php'; echo "this is b.php"; echo "<hr>"; require('../c/c.php'); ?>
설명할 필요는 없습니다. 문제는 없습니다. 하지만 require('../c/c.php')를 c/c.php의 코드로 바꾸면 문제를 발견할 수 있습니다. 방금 c/c.php의 코드를 수정하고 require('../d/d.php')를 require('d/d.php')로 변경했습니다. 아래 코드에 포함된 내용을 확인하세요.
<?php $file_name = 'b.php'; echo "this is b.php"; echo "<hr>"; // require('../c/c.php'); $c_file_name = 'c.php'; echo 'this is c.php, is required by ' . $file_name; echo "<hr>"; require('d/d.php'); ?>
따라서 b/b.php와 비교하면 require('d/d.php');의 경로가 잘못되었습니다. require('../d/d.php');여야 합니다. 돌아가서 c/c.php의 필수 경로를 수정했는데 잘못된 것입니다. 변경한 후에는 b/b.php는 정상적으로 실행되지만 a/a.php는 c를 공유할 수 없다는 것이 사실입니까? /c?.php, 전신에 영향을 미치는데 어떻게 해야 하나요?
이때 글 서두에서 언급한 dirname(__FILE__)으로 돌아가면 이는 좋은 일이며 위의 문제를 완전히 해결할 수 있습니다. 이를 사용하면 어떤 파일에 파일이 포함되어 있는지, 어떤 경로에 있는지 걱정할 필요가 없습니다. dirname(__FILE__)이 해당 파일을 기준으로 경로를 지정할 수 있기 때문입니다. 현재 파일. 즉, c/c.php의 필수 경로를 다음으로 변경해야 합니다.
<?php $c_file_name = 'c.php'; echo 'this is c.php, is required by ' . $file_name; echo "<hr>"; require(dirname(__FILE__) . '/../d/d.php'); ?>
여기서는 c/c.php만 참고하면 되는데 비해 d/d.php는 상위 수준입니다. 이런 식으로 기준은 오직 하나, 즉 내가 이긴다는 것입니다. 당신이 나를 포함하든 그 사람이 나를 포함하든 나는 나 자신만을 기준으로 삼고, 내가 포함시키고 싶은 파일은 나 자신과 관련이 있을 뿐입니다.
dirname(__FILE__)을 이해하지 못하는 동수들을 위해 구글에 검색해 보세요. 매우 간단합니다.
이상으로 PHP 기술 공유는 종료됩니다. 질문이나 오류가 있으면 메시지를 남겨주세요. 그건 그렇고, 이것은 나의 첫 번째 표준 기술 블로그 게시물입니다. 첫 번째 기사는 수문학이고, 두 번째 기사는 준기술적이며, 오늘 드디어 기술 기사인 Ou Ye를 썼습니다.