PHP Include/Require:文件包含及路径详解

小飞兽 PHP 18 次阅读 2026-07-16

为什么需要文件包含

文件包含让你把公共代码(头部、底部、数据库连接、函数库)放在单独文件中,其他页面引用即可。避免代码重复,方便维护。

四种包含方式

1. include — 包含文件

<?php\n// 如果文件不存在,只产生警告,代码继续执行\ninclude 'config.php';\ninclude 'functions.php';\n?>

2. require — 包含文件(必需)

<?php\n// 如果文件不存在,产生致命错误(Fatal Error),停止执行\nrequire 'config.php';\nrequire 'db.php';\n?>

3. include_once / require_once — 只包含一次

<?php\n// 防止同一个文件被重复包含(避免函数重定义、变量重复赋值)\ninclude_once 'header.php';\nrequire_once 'database.php';\n\n// 如果 header.php 在前面已经 include 过了,这里会忽略\ninclude_once 'header.php';  // 被忽略\n?>

如何选择

    • 核心配置/函数库(必须有):用 require
    • 模板文件(可选/缺失不影响核心):用 include
    • 不确定是否已包含过:用 _once 版本

    路径详解

    相对路径

    <?php\n// 当前目录(相对于当前脚本)\ninclude './config.php';\n\n// 上级目录\ninclude '../config.php';\ninclude '../../config.php';\n\n// 相对于 __DIR__(推荐,避免路径问题)\ninclude __DIR__ . '/config.php';\ninclude __DIR__ . '/../lib/functions.php';\n?>

    绝对路径

    <?php\n// 物理绝对路径\nrequire '/var/www/html/includes/config.php';\n\n// 动态获取网站根目录\ndefine('ROOT_PATH', dirname(__DIR__));\nrequire ROOT_PATH . '/config.php';\n\n// $_SERVER[\'DOCUMENT_ROOT\'] 是网站根目录\nrequire $_SERVER['DOCUMENT_ROOT'] . '/includes/config.php';\n?>

    include_path

    <?php\n// PHP 会从 include_path 指定的目录查找文件\n// 默认 include_path = ".:/usr/share/php"\n\n// 临时设置 include_path\nset_include_path('/var/www/lib:' . get_include_path());\ninclude 'database.php';  // 优先从 /var/www/lib 找\n\n// 或者用 ini_set\nini_set('include_path', '/var/www/lib');\n?>

    路径解析规则

    <?php\n// 假设当前脚本在 /var/www/html/admin/users.php\n\ninclude '../config.php';        // /var/www/html/config.php\ninclude __DIR__ . '/header.php'; // /var/www/html/admin/header.php\n\n// 特别注意:include/require 的路径是相对于主脚本的,\n// 而不是相对于被包含的文件\n?>

    实践:标准的项目结构

    /var/www/\n  index.php          // 入口文件\n  config/\n    database.php     // 数据库配置\n    app.php          // 应用配置\n  includes/\n    header.php       // 公共头部\n    footer.php       // 公共底部\n    functions.php    // 公共函数\n  lib/\n    utils.php        // 工具类\n    helper.php\n  admin/\n    dashboard.php    // 后台页面\n
    <?php\n// index.php\ndefine('ROOT_PATH', __DIR__);\ndefine('INC_PATH', ROOT_PATH . '/includes');\n\nrequire INC_PATH . '/config/database.php';\nrequire INC_PATH . '/functions.php';\nrequire INC_PATH . '/header.php';\n?>

    变量作用域与被包含文件

    <?php\n$site_name = '绍大技术网';\n\n// 被包含的文件可以访问主脚本的变量\n// config.php 里:echo $site_name; → 输出"绍大技术网"\ninclude 'config.php';\n\n// 传递变量到被包含文件\n$title = '用户列表';\ninclude 'user_list.php';  // user_list.php 里可用 $title\n?>

    错误处理

    <?php\n// 基础处理:文件不存在时显示友好提示\n$config_file = __DIR__ . '/config.php';\n\nif (file_exists($config_file)) {\n    require $config_file;\n} else {\n    die('配置文件缺失,请联系管理员');\n    // 或:throw new Exception('配置文件缺失');\n}\n\n// 使用 @ 抑制警告(不推荐)\n@include 'optional.php';  // 不推荐,隐藏了错误\n?>

    被包含文件的返回值

    <?php\n// config.php 可以返回值\n// return ['host' => 'localhost', 'db' => 'myapp'];\n\n$config = require __DIR__ . '/config.php';\necho $config['host'];  // localhost\n\n// PHP 7+ 支持类型声明\n$config = require __DIR__ . '/config.php';  // 期望返回 array\n?>

    命名空间与自动加载

    <?php\n// classes/User.php\nnamespace App\\Models;\n\nclass User {\n    public static function find($id) { ... }\n}\n\n// 手动加载\nrequire 'classes/User.php';\nrequire 'classes/Article.php';\n\n// Composer 自动加载(推荐)\n// composer.json 定义 autoload 后,运行 composer dump-autoload\nrequire 'vendor/autoload.php';\n\nuse App\\Models\\User;\n$user = User::find(1);\n?>

    总结

    • require 用于核心文件(文件不存在会致命错误),include 用于可选文件
    • _once 防止重复包含
    • __DIR__ 优于相对路径,避免路径问题
  • 文件不存在时先 file_exists() 检查
  • 大型项目用 Composer autoload 替代手动 include