PHP 引入 PHP
在 PHP 开发中,我们几乎不会把所有代码写在一个文件里。将配置、函数、类、视图拆分到不同文件,通过 "引入" 机制组合使用,是实现代码复用、模块化开发的核心手段。
PHP 提供了四种常用的文件引入方式:include、require、include_once、require_once。
引入方式
include:包含并运行文件
include 是最基础的引入方式,它会将指定文件的内容 "插入" 到当前位置并执行。
php
include '文件路径';
// 或带括号(可选,风格问题)
include('文件路径');
- 错误处理宽松 :如果引入的文件不存在,会抛出一个警告(Warning) ,但脚本会继续执行。
- 可重复引入:同一个文件可以被引入多次。
假设我们有一个公共的页头文件 header.php:
php
<!-- header.php -->
<!DOCTYPE html>
<html>
<head>
<title>我的网站</title>
</head>
<body>
<header>
<nav>
<a href="/">首页</a> | <a href="/about">关于</a>
</nav>
</header>
在首页 index.php 中引入它:
php
<!-- index.php -->
<?php include 'header.php'; ?>
<main>
<h1>欢迎来到首页</h1>
</main>
</body>
</html>
require:必须包含文件
require 的功能与 include 几乎完全一致,核心区别在于错误处理。
php
require '文件路径';
- 错误处理严格 :如果引入的文件不存在,会抛出一个致命错误(Fatal Error) ,脚本会立即停止执行。
- 可重复引入。
配置文件(如数据库配置)是 "必须存在" 的,用 require 更合适:
php
<?php
// config.php(配置文件)
return [
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => 'your_password',
'db_name' => 'test_db'
];
php
<?php
// index.php
// 用 require 引入配置文件(如果 config.php 丢了,程序直接停止,避免后续错误)
$config = require __DIR__ . '/config.php';
// 使用配置
echo "数据库主机:" . $config['db_host'];
include_once / require_once:避免重复引入
如果引入的文件包含函数定义、类定义,重复引入会导致 "函数 / 类已定义" 的致命错误。
*_once 系列会自动检测文件是否已被引入,只引入一次。
php
include_once '文件路径';
require_once '文件路径';
- 继承
include/require的错误处理特性。 - 自动去重:同一文件只引入一次,避免重复定义错误。
假设我们有一个函数库 functions.php:
php
<?php
// functions.php
function format_money($amount) {
return '¥' . number_format($amount, 2);
}
如果不用 *_once,重复引入会报错:
php
<?php
// 错误示范:不用 once
include 'functions.php';
include 'functions.php'; // 这里会报错:Fatal error: Cannot redeclare format_money()
使用 include_once 解决:
php
<?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
<?php
// public/index.php
// __DIR__ 是 "project/public",拼接 "/../config.php" 得到绝对路径
$config = require __DIR__ . '/../config.php';
include_once __DIR__ . '/../functions.php';
实用开发场景
MVC 中的视图模块化
在简单的 MVC 架构中,我们通常把视图拆分成 header、footer 和主内容:
php
<?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
<?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中关闭错误显示,记录到日志文件。