PHP 引入 PHP

0 阅读3分钟

PHP 引入 PHP

在 PHP 开发中,我们几乎不会把所有代码写在一个文件里。将配置、函数、类、视图拆分到不同文件,通过 “引入” 机制组合使用,是实现代码复用、模块化开发的核心手段。

PHP 提供了四种常用的文件引入方式:includerequireinclude_oncerequire_once

引入方式

include:包含并运行文件

include 是最基础的引入方式,它会将指定文件的内容 “插入” 到当前位置并执行。

include '文件路径';
// 或带括号(可选,风格问题)
include('文件路径');
  • 错误处理宽松:如果引入的文件不存在,会抛出一个警告(Warning) ,但脚本会继续执行
  • 可重复引入:同一个文件可以被引入多次。

假设我们有一个公共的页头文件 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 '文件路径';
  • 错误处理严格:如果引入的文件不存在,会抛出一个致命错误(Fatal Error) ,脚本会立即停止执行
  • 可重复引入

配置文件(如数据库配置)是 “必须存在” 的,用 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 架构中,我们通常把视图拆分成 headerfooter 和主内容:

<?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

最佳实践总结

  1. 必需文件用 require:配置文件、核心函数库等 “丢了就不能运行” 的文件,用 require 或 require_once
  2. 函数 / 类用 *_once:凡是包含函数、类定义的文件,必须用 include_once 或 require_once,避免重复定义错误。
  3. 永远用 __DIR__ 构建绝对路径:告别相对路径的困扰,保证代码在任何环境下都能正常运行。
  4. 生产环境隐藏错误:不要把 include/require 的错误信息直接暴露给用户,应在 php.ini 中关闭错误显示,记录到日志文件。