枪战英雄
99.99M · 2026-03-28
在 PHP 开发中,我们几乎不会把所有代码写在一个文件里。将配置、函数、类、视图拆分到不同文件,通过 “引入” 机制组合使用,是实现代码复用、模块化开发的核心手段。
PHP 提供了四种常用的文件引入方式:include、require、include_once、require_once。
include:包含并运行文件include 是最基础的引入方式,它会将指定文件的内容 “插入” 到当前位置并执行。
include '文件路径';
// 或带括号(可选,风格问题)
include('文件路径');
假设我们有一个公共的页头文件 header.php:
<!-- header.php -->
<!DOCTYPE html>
<html>
<head>
<title>我的网站</title>
</head>
<body>
<header>
<nav>
<a href="/">首页</a> | <a href="/about">关于</a>
</nav>
</header>
在首页 index.php 中引入它:
<!-- index.php -->
<?php include 'header.php'; ?>
<main>
<h1>欢迎来到首页</h1>
</main>
</body>
</html>
require:必须包含文件require 的功能与 include 几乎完全一致,核心区别在于错误处理。
require '文件路径';
配置文件(如数据库配置)是 “必须存在” 的,用 require 更合适:
<?php
// config.php(配置文件)
return [
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => 'your_password',
'db_name' => 'test_db'
];
<?php
// index.php
// 用 require 引入配置文件(如果 config.php 丢了,程序直接停止,避免后续错误)
$config = require __DIR__ . '/config.php';
// 使用配置
echo "数据库主机:" . $config['db_host'];
include_once / require_once:避免重复引入如果引入的文件包含函数定义、类定义,重复引入会导致 “函数 / 类已定义” 的致命错误。
*_once 系列会自动检测文件是否已被引入,只引入一次。
include_once '文件路径';
require_once '文件路径';
include/require 的错误处理特性。假设我们有一个函数库 functions.php:
<?php
// functions.php
function format_money($amount) {
return '¥' . number_format($amount, 2);
}
如果不用 *_once,重复引入会报错:
<?php
// 错误示范:不用 once
include 'functions.php';
include 'functions.php'; // 这里会报错:Fatal error: Cannot redeclare format_money()
使用 include_once 解决:
<?php
// 正确示范:用 once
include_once 'functions.php';
include_once 'functions.php'; // 第二次引入会被自动忽略,不会报错
echo format_money(100); // 输出:¥100.00
| 方式 | 错误处理 | 重复引入 | 适用场景 |
|---|---|---|---|
include | 警告,继续执行 | 允许 | 引入非必需的模板(如侧边栏) |
require | 致命错误,停止 | 允许 | 引入必需的核心文件(如配置) |
include_once | 警告,继续执行 | 禁止 | 引入函数库、类库(非必需) |
require_once | 致命错误,停止 | 禁止 | 引入函数库、类库(必需) |
引入文件时,路径写错是最常见的错误。
PHP 路径分为 “相对路径” 和 “绝对路径”,推荐永远使用绝对路径。
使用魔术常量 __DIR__(当前文件所在的目录)构建绝对路径,无论在哪里调用都不会出错。
<?php
// public/index.php
// __DIR__ 是 "project/public",拼接 "/../config.php" 得到绝对路径
$config = require __DIR__ . '/../config.php';
include_once __DIR__ . '/../functions.php';
MVC 中的视图模块化
在简单的 MVC 架构中,我们通常把视图拆分成 header、footer 和主内容:
<?php
// controller.php
$pageTitle = '文章列表';
$articles = [/* 文章数据 */];
// 引入头部
require __DIR__ . '/views/header.php';
// 引入主内容视图
require __DIR__ . '/views/article_list.php';
// 引入底部
require __DIR__ . '/views/footer.php';
自动加载类
如果类文件很多,一个个 require_once 太麻烦,可以使用 spl_autoload_register() 自动加载:
<?php
// autoload.php
spl_autoload_register(function ($className) {
// 假设类文件都在 src/ 目录下,类名与文件名对应
$file = __DIR__ . '/src/' . $className . '.php';
if (file_exists($file)) {
require_once $file;
}
});
// 使用时,直接 new 类,无需手动引入
require __DIR__ . '/autoload.php';
$user = new User(); // 自动加载 src/User.php
require:配置文件、核心函数库等 “丢了就不能运行” 的文件,用 require 或 require_once。*_once:凡是包含函数、类定义的文件,必须用 include_once 或 require_once,避免重复定义错误。__DIR__ 构建绝对路径:告别相对路径的困扰,保证代码在任何环境下都能正常运行。include/require 的错误信息直接暴露给用户,应在 php.ini 中关闭错误显示,记录到日志文件。