PHP에 대한 자세한 설명은 주문을 요구하고 포함합니다.

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

대규모 웹 프로젝트에서 include_path는 모듈화 디자인의 기초입니다(물론 자동 로드를 기반으로 한 디자인도 많이 있으므로 이 기사의 논의에는 영향을 미치지 않습니다). 그러나 바로 include_path 때문입니다. , 종종 이로 인해 올바른 파일을 찾지 못해 겉보기에 "이상한" 문제가 발생하게 됩니다.

다음 질문도 발생합니다.

include_path는 어떻게 작동합니까?

여러 개가 있는 경우 순서는 무엇입니까? include_path?

include_path는 어떤 상황에서 작동하지 않나요?

오늘은 이 문제를 예제부터 시작하여 종합적으로 소개하겠습니다.

다음디렉토리 구조:

  root    
  ├ 1.php    
  ├ 3.php    
  └ subdir         
  ├ 2.php          
  └ 3.php
로그인 후 복사

1.php에서:

코드

<?php 
ini_set("include_path", ".:path_to_subdir"); 
require
("2.php"); 
?>
로그인 후 복사


그리고 2.php에서는:

<?php 
require("3.php"); 
?>
로그인 후 복사

그리고 루트 디렉터리의 3.php는 "root"를 인쇄하고, subdir 디렉터리의 3.php는 "root" "subdir"을 인쇄합니다.

이제 내 질문이 나옵니다:
1. 루트 디렉터리에서 1.php를 실행하면 어떤 결과가 나오나요?
2. 하위 디렉터리 아래의 상위 디렉터리에서 1.php를 실행하면 어떤 결과가 나올까요?
3. include_path(즉, include_path="path_to_subdir")에서 현재 디렉터리 경로를 취소하면 위 두 질문의 결과는 무엇입니까?
include_path in PHP
PHP에서는 require( _once)/include( _once) 명령에 따라 다음과 같은 판단이 먼저 이루어집니다. 포함할 파일 경로가 절대 경로입니까?

그렇다면 직접 포함하고 종료합니다.
아니면 다른 논리를 입력합니다( 여러 번 호출한 후 매크로가 확장되고 _php_stream_fopen_with_path)를 입력하여 이 파일을 찾습니다.


다음으로 _php_stream_fopen_with_path에서 다음과 같은 판단이 내려집니다.

포함할 파일 경로가 상대 경로(./file, ../dir/ 형식)인지 여부 대신 아래의 "디렉터리 상대 경로"를 사용하세요)
그렇다면 include_path 로직을 건너뛰고 상대 경로를 직접 파싱하세요(추후 별도로 소개합니다)


경로는 include_path와 현재 실행 파일을 기반으로 합니다. 예를 들어 이전 기사의 예에서는 다음과 같이 후보 목록이 구성됩니다.

코드는 다음과 같습니다.

".:path_to_subdir:current_script_dir
로그인 후 복사

그러면 다음과 같이 후보 목록의 선두부터 시작됩니다. DEFAULT_DIR_SEPARATOR( 이 글의 환경은 ":" 입니다.) 후보 목록에서 경로를 꺼내고 경로에 포함할 파일 이름을 추가하고 성공적으로 포함되면 반환하고 그렇지 않으면 다음 후보로 계속 진행합니다.
지금까지는 처음에 제기한 3가지 질문에 답할 수 있습니다.
1. 2.php가 1.php에 포함될 때, include_path의 두 번째 후보 경로는 루트 디렉터리에서 실행됩니다. role.(path_to_subdir), path_to_subdir/2.php를 찾았고, 2.php에 3.php가 포함되어 있는 경우 현재 작업 디렉터리는 루트 아래이므로 3.php가 포함되어 있는 경우에는 include_path가 첫 번째 후보 경로입니다." "( 현재 작업 디렉터리), 따라서 출력은 "root"입니다.
2. 현재 경로가 subdir이라는 점을 제외하고는 "subdir"입니다.
3. 왜냐하면 현재 경로가 더 이상 include_path가 아니기 때문입니다. 2.php는 루트 디렉터리에서 실행될 때 3.php에 포함되어 있으며 path_to_subdir이 역할을 하므로 루트이든 하위 디렉터리이든 "subdir"이 출력됩니다.
그리고 2.php에서 include_path를 지우면

<?php 
ini_set("include_path", &#39;&#39;); 
require("3.php"); 
?>
로그인 후 복사


그러면 current_script_dir이 적용되며 이때 current_script_dir은 2.php의 경로이므로 여전히 "subdir"이 출력됩니다.
Directory 상대 경로
디렉토리 상대 경로를 사용할 때 상대 경로의 기준점은 항상 현재 작업 디렉터리입니다.
디렉터리 상대 경로 아래의 상황을 설명하기 위해 다른 예를 살펴보겠습니다. 여전히 위의 디렉터리 구조이지만 1.php는 이제 다음과 같습니다.

<?php 
ini_set("include_path", "/"); 
require("./subdir/2.php"); ?>
로그인 후 복사


2 .php는 다음과 같습니다.

<?php 
require("./3.php"); 
?>
로그인 후 복사


루트 디렉터리에서 실행하면 2.php에서 3.php를 검색하면 현재 디렉터리의 상대 경로에서 검색되므로 얻어지는 출력은 "root"이고, 1을 실행하면 .php (php -f ../1.php)는 하위 디렉토리 아래에 "./subdir/2.php"가 없기 때문에 예외가 발생합니다.
Postscript
1. include_path와 상대 경로를 사용하는 경우 성능은 검색 횟수와 관련이 있습니다. 최악의 경우 include_path가 10개인 경우 이를 찾기 위해 최대 11번까지 재시도해야 할 수도 있으므로 해당됩니다.
2. 디렉터리 상대 경로의 기반 경로는 항상 현재 작업 경로이므로 이를 사용하려면 실제 배포 경로와 연결되어야 합니다. 그래서 실제로는 거의 사용되지 않습니다(물론 chdir을 사용하는 모듈도 있습니다).
3. 모듈식 시스템 설계에서는 일반적으로 모듈의 배포 경로(dirname(FILE)를 얻으려면 모듈 내에 있어야 합니다.) , php5.3 이상에서는 DIR 상수가 제공됩니다.

위 내용은 PHP에 대한 자세한 설명은 주문을 요구하고 포함합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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