2021-10-09 03:50:28
在PHP中,包含另一个PHP文件主要通过include、require及其变体include_once、require_once实现,核心区别在于错误处理和重复包含的规避,路径推荐使用__DIR__构建绝对路径以确保稳定性。
一、基础包含语句的用法与区别include
语法:include 'path/to/file.php';
行为:文件不存在时发出E_WARNING警告,脚本继续执行。
适用场景:非核心、可选组件(如广告模块、统计代码),缺失不影响主体功能。
示例:echo "脚本开始执行。n";include 'non_existent_file.php'; // 警告,但脚本继续echo "脚本继续执行到这里。n"; // 正常输出
require
语法:require 'path/to/file.php';
行为:文件不存在时抛出E_ERROR致命错误,脚本立即终止。
适用场景:核心文件(如数据库配置、关键类定义),缺失导致应用无法运行。
示例:echo "脚本开始执行。n";require 'non_existent_critical_file.php'; // 致命错误,脚本终止echo "脚本继续执行到这里。n"; // 不会执行
选择建议:
include_once
语法:include_once 'path/to/file.php';
行为:文件不存在时发出警告;已包含则跳过;未包含则执行包含。
适用场景:非核心文件的可选包含,需防止重复定义(如函数、全局变量)。
require_once
语法:require_once 'path/to/file.php';
行为:文件不存在时抛出致命错误;已包含则跳过;未包含则执行包含。
适用场景:核心文件的强制包含,确保唯一性(如类、接口、配置常量)。
示例:// functions.phpfunction greet($name) { return "Hello, " . $name . "!"; }// index.phprequire_once 'functions.php'; // 第一次包含require_once 'another_script.php'; // 假设其也包含 functions.php// another_script.phprequire_once 'functions.php'; // 跳过,避免重复定义
选择建议:
相对路径的潜在问题
基准点为当前执行脚本目录,而非包含语句所在文件目录。
示例:/project/├── index.php├── includes/│ └── header.php└── lib/ └── utils.php
index.php中包含includes/header.php正常,但header.php中include '../lib/utils.php'可能因调用者位置不同而失败(如从/project/admin/dashboard.php调用时路径解析错误)。
绝对路径的解决方案
__DIR__:当前文件的目录绝对路径,推荐用于构建稳定路径。// /project/includes/header.phprequire_once __DIR__ . '/../lib/utils.php'; // 稳定指向 /project/lib/utils.php
$_SERVER['DOCUMENT_ROOT']:Web根目录,适用于Web脚本但不适用于CLI。require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
路径选择建议:
总结: