php基础-文件包含(第13天)
文件包含
一.什么是文件包含?
1.概念
在一个php脚本中,将另一个文件(PHP)包含进来,去合作完成一件事情,
2.作用
文件包含的意义:
- 被包含文件提供功能,主文件调用这些功能,实现代码复用
最大的作用:
- 分工协作,每个脚本做的事情不一样,因此可以使用分工协作的方式,让多个脚本共同完成一件事情
3.文件包含的四种形式
3.1在PHP中文件的包含有四种形式(两种大形式)
Include :包含文件
Include_once:系统会自动判断文件包含过程中,是否已经包含过(一个文件最多被包含一次)
Require : 包含文件同Include
Require_once :同Include_once
3.2.Include 和require的区别
-
错误处理方式不同
include
:如果找不到文件,会抛出一个 warning(警告),程序会继续往下执行。require
:如果找不到文件,会抛出一个 fatal error(致命错误),程序会直接中断,不再继续。
举个例子:
// test.php include 'abc.php'; // 如果 abc.php 不存在,会警告,但 echo 还是会执行 echo "我还能执行";require 'abc.php'; // 如果 abc.php 不存在,直接报致命错误 echo "这行永远不会执行";
如下报错:
- Warning: include(abc.php): Failed to open stream: No such file or directory 没有找到当前文件
- 如果是include Warning: include(): Failed opening ‘abc.php’ for inclusion (include_path=‘.:/opt/homebrew/Cellar/php/8.4.12/share/php/pear’) 尝试包含文件失败
- 如果是require 则为 Fatal error: Uncaught Error: Failed opening required ‘log2.php’ (include_path=‘.:/opt/homebrew/Cellar/php/8.4.12/share/php/pear’)
-
once 的作用
include_once
和require_once
会先检查文件是否已被加载过,如果已经包含过,就不会再重复包含。- 用于避免 函数/类重复定义 造成的报错。
include 'config.php'; include 'config.php'; // 可能重复引入,导致报错include_once 'config.php'; // 只会引入一次,安全
-
适用场景
include
更适合可选文件(比如一些模板、广告位),即使没有也不影响核心逻辑。require
更适合必须文件(比如数据库配置、核心函数库),缺了就没法运行。
4. 小结一句话
- 能少就少,用
_once
更保险 - 可缺就 include,必需就 require
二.文件加载原理
- 1.在文件加载(inculde 或者 require)时候,系统会自动的将被包含件中的包含文件中的代码相遇嵌入到当前文件中
- 2.加载位置:在哪加载,对应的文件中的代码嵌入的位置就是对应的include位置
- 3.在php中被包含的文件是单独进行编译的
- PHP文件在编译的过程中如果出现了语法错误,那么编译会失败,文件无法执行;
- 但如果是包含文件有错误的时候,PHP会在执行到包含include这条语句的时候才会报错
PHP代码的执行流程:
1、读取代码文件(PHP程序)
2、编译:将PHP代码转换成中间字节码(生成opcode),这是 PHP 内部执行的形式
3、zend engine(Zend引擎解析执行)来解析opcode 按照字节码去进行逻辑运算
4、再转换成对应的HTML代码,发送到浏览器
三.文件加载路径
文件在加载的时候需要执行文件路径才能保证PHP正确的找到对应的文件
文件的加载路径分类:
-
绝对路径
- 从磁盘的根目录开始(本地绝对路径)
- window:盘符:C:/路径/PHP文件
- 从网站根目录开始(网站绝对路径) 相对于网站主机名字对应的路径
-
相对路径:从当前文件所在的目录开始的路径
- ./ 表示当前文件夹
- …/ 表示上级目录(当前文件夹的上一层文件)
两者加载的区别:
- 绝对路劲个相对效率偏低,但是相对安全(路径不会出问题)
- 相对路径相对效率高些,但是容易出错(相对路径会发生改变)
实践建议:
-
开发阶段,推荐使用相对路径,方便移动项目。
-
部署生产环境时,绝对路径更稳定,避免路径解析错误。
-
可结合
__DIR__
或$_SERVER['DOCUMENT_ROOT']
来构造安全可靠的路径:include __DIR__ . "/file.php"; // __DIR__ 表示当前文件所在目录 include $_SERVER['DOCUMENT_ROOT'] . "/project/file.php"; // 网站根目录
四.文件嵌套包含
子文件本身含有包含子文件
嵌套包含的时候就很容易出现相对路径出错的问题,相对路径会因为文件的包含而改变
-
相对路径是基于“当前执行脚本的位置”,而不是被包含文件的位置。
-
示例:
project/ ├─ index.php (父文件) ├─ folder/├─ a.php (子文件)└─ b.php (孙文件)
// index.php include "./folder/a.php";// a.php include "./b.php"; // 相对路径错误!PHP 会以 index.php 的目录作为参考
-
原因:虽然
b.php
与a.php
在同一目录,但 PHP 会以index.php
的位置作为相对路径起点,因此找不到b.php
。
3. 解决方案
-
使用
__DIR__
常量,它总是指向当前文件所在目录:// a.php include __DIR__ . "/b.php"; // 相对 a.php 的目录
-
使用绝对路径:
include "/var/www/html/project/folder/b.php";
-
或者使用
require_once
/include_once
来避免重复包含造成的错误。
总结:
在文件嵌套包含时,尽量用
__DIR__
或绝对路径,避免相对路径因为父文件位置而出错。