深入理解PHP之require/include顺序 推荐
在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经
也就有了如下的疑问:
include_path是怎么起作用的?
如果有多个include_path顺序是怎么样的?
什么情况下include_path不起作用?
今天, 我就全面的介绍下这个问题, 先从一个例子开始吧.
如下的目录结构:
在1.php中:
复制代码 代码如下:
ini_set("include_path", ".:path_to_subdir");
require("2.php");
?>
而在2.php中:
复制代码 代码如下:
require("3.php");
?>
而在root目录下的3.php打印出”root”, 在subdir目录下的3.php打印出”subdir”;
现在, 我的问题来了:
1. 当在root目录下运行1.php, 会得到什么输出?
2. 在subdir下运行上一级目录的1.php, 有会得到什么输出?
3. 当取消include_path中的当前目录path(也就是include_path=”path_to_subdir”), 上面俩个问题又会是什么输出?
PHP中的include_path
PHP在遇到require(_once)/include(_once)的指令的时候, 首先会做如下的判断:
复制代码 代码如下:
要包含的文件路径是绝对路径么?
如果是, 则直接包含, 并结束.
如果不是, 进入另外的逻辑(经过多次调用, 宏展开后进入_php_stream_fopen_with_path)寻找此文件
接下来, 在_php_stream_fopen_with_path中, 会做如下判断:
复制代码 代码如下:
要包含的文件路径是相对路径么(形如./file, ../dir/file, 以下用"目录相对路径代替")?
如果是, 则跳过include_path的作用逻辑, 直接解析相对路径(随后单独介绍)
会根据include_path,和当前执行文件的path组成一个待选的目录列表, 比如对于文章前面的例子来说, 会形成一个如下的待选列表
复制代码 代码如下:
".:path_to_subdir:current_script_dir
然后, 依次从待选列表头部开始, 根据DEFAULT_DIR_SEPARATOR(本文的环境是”:”)取出待选列表中的一个路径, 然后把要包含的文件名附加在这个路径后面, 进行尝试. 如果成功包含, 则返回, 否则继续下一个待选路径.
到现在为止, 我们已经可以回答我开头提出的3个问题了.
1. 因为在root目录下执行, 所以在1.php中包含2.php的时候, include_path的第二个待选路径起了作用(path_to_subdir), 找到了path_to_subdir/2.php, 而在2.php包含3.php的时候, 当前工作目录是root下, 所以在包含3.php的时候, include_path的第一个待选路径”.”(当前工作目录)下就找到的匹配的文件, 所以得到的输出是”root”.
2. 同1, 只不过当前的路径是subdir, 所以得到的输出是”subdir”.
3. 因为没有了当前路径为include_path, 所以在root目录下运行的时候2.php中包含3.php的时候, 是path_to_subdir起了作用, 所以无论在root还是subdir都将得到”subdir”的输出.
而如果在2.php中清空include_path,
复制代码 代码如下:
ini_set("include_path", '');
require("3.php");
?>
那么将会是current_script_dir起作用, 而这个时候current_script_dir是2.php的路径, 所以还是会得到”subdir”的输出.
目录相对路径
在使用目录相对路径的情况下, 相对路径的基点, 永远都是当前工作目录.
为了说明在目录相对路径下的情况,我们再看个列子, 还是上面的目录结构, 只不过1.php变成了:
复制代码 代码如下:
ini_set("include_path", "/");
require("./subdir/2.php");
?>
2.php变成了:
复制代码 代码如下:
require("./3.php");
?>
如果在root目录下执行, 2.php中寻找3.php将会在当前目录的相对路径下寻找, 所以得到的输出是”root”, 而如果是在subdir下执行上一级目录的1.php(php -f ../1.php), 将会因为在subdir下找不到”./subdir/2.php”而异常退出.
后记
1. 因为使用include_path和相对路径的情况下, 性能会和寻找的次数有关, 最坏的情况下, 如果你有10个include_path, 那么最多可能会重试11次才能找到要包含的文件, 所以, 在能使用绝对路径的情况下最好使用绝对路径.
2. 因为目录相对路径的basedir, 永远都是当前工作路径, 如果要使用, 需要和实际部署路径相关, 所以实际使用的很少(当然, 也有借助chdir来完成的模块).
3. 在模块化的系统设计中, 一般应该在模块内, 通过获取模块的部署路径(dirname(__FILE__), php5.3以后更是提供了__DIR__常量)从而使用绝对路径. ,香港服务器租用,香港服务器,服务器空间

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











vue3+vite:src는 require를 사용하여 이미지를 동적으로 가져오고 vue3+vite는 여러 이미지를 동적으로 가져옵니다. vue3을 사용하는 경우 require는 이미지를 사용할 수 없습니다. imgUrl:require(' .../assets/test.png') 와 같은 vue2는 typescript가 require를 지원하지 않기 때문에 가져오므로 이를 해결하는 방법은 다음과 같습니다. waitimport를 사용합니다.

PHP를 사용하여 웹 페이지를 작성할 때 때로는 현재 PHP 파일에 다른 PHP 파일의 코드를 포함해야 할 때가 있습니다. 이때, include 또는 include_once 함수를 사용하여 파일 포함을 구현할 수 있습니다. 그렇다면 include와 include_once의 차이점은 무엇입니까?

require 사용법: 1. 모듈 소개: 많은 프로그래밍 언어에서 require는 외부 모듈이나 라이브러리를 소개하여 이들이 제공하는 기능을 프로그램에서 사용할 수 있도록 하는 데 사용됩니다. 예를 들어 Ruby에서는 require를 사용하여 타사 라이브러리나 모듈을 로드할 수 있습니다. 2. 클래스 또는 메서드 가져오기: 일부 프로그래밍 언어에서는 require를 사용하여 특정 클래스나 메서드를 현재 파일에서 사용할 수 있도록 가져옵니다. 3. 특정 작업 수행: 일부 프로그래밍 언어나 프레임워크에서는 특정 작업이나 기능을 수행하는 데 require가 사용됩니다.

PHP 헤더의 fatalerror:require():Failedopeningrequired'data/tdk.php'(include_path='.;C:phppear') 해결 단계 PHP를 사용하여 웹사이트나 애플리케이션을 개발할 때 다양한 오류가 자주 발생합니다. 일반적인 오류 중 하나는 "fatalerror:require():Failed"입니다.

PHP에서 require 키워드의 역할과 사용법에 대한 자세한 설명 PHP 개발에서 require는 매우 일반적으로 사용되는 키워드입니다. 그 기능은 현재 스크립트에서 사용하기 위해 지정된 파일을 포함하는 것입니다. 이번 글에서는 require 키워드의 기능과 사용법을 자세히 설명하겠습니다. 1. require 키워드의 역할 require 키워드는 현재 스크립트에 파일의 내용을 포함시킬 수 있습니다. 일반적으로 라이브러리 파일, 구성 파일 등과 같은 필요한 외부 파일을 포함하는 데 사용됩니다. 요구사항 사용

PHP 헤더의 FatalError:require():Failedopeningrequired'data/tdk.php'를 해결하는 단계 PHP 웹사이트를 개발하고 유지 관리할 때 다양한 오류와 예외가 자주 발생합니다. 일반적인 오류 중 하나는 "FatalError:require():Failedopeningrequired'data/tdk.php'"입니다.

소개 PHP에서는 해당 내장 래퍼의 도움으로 다양한 URL 스타일 프로토콜을 파일 시스템 기능과 함께 사용할 수 있습니다. stream_wrapper_register() 함수를 사용하여 사용자 정의 래퍼를 정의할 수도 있습니다. PHP의 기본 래퍼는 로컬 파일 시스템을 나타내는 file://입니다. 다른 프로토콜이 명시적으로 사용되지 않으면 PHP 파서는 이를 파일 시스템 래퍼로 처리합니다. 파일 시스템 함수 fopen(), file_get_contents() 등에 전달된 파일 이름 매개변수는 기본적으로 file:// 프로토콜을 사용합니다. 파일 이름이 슬래시, 백슬래시 또는 Windows 드라이버로 시작하지 않는 경우

기본 php,ini 파일에 .ini 파일을 포함할 수 없습니다. 대조적으로, PHP를 컴파일할 때 --with-config-file-scan-dir=PATH&a 줄은
