核心區別
| 特性 | include | require |
| 文件不存在 | 發出 **E_WARNING**,腳本**繼續執行** | 發出 **E_COMPILE_ERROR**,腳本**立即終止** |
| 返回值 | 成功返回 1,失敗返回 false | 成功返回文件返回值,失敗不返回(終止) |
| 適用場景 | 可選組件、模板、非關鍵配置 | 核心類庫、關鍵配置、必須存在的文件 |
基礎用法示例
<?php
// include.php - 被引入文件
function a() { b(); }
function b() { c(); }
function c() { echo 'bb'; }
a();
// main.php - 主文件
include 'include.php'; // 輸出: bb
echo a(); // 注意:a() 無返回值,此處輸出 NULL
// require 示例
require 'config/database.php'; // 必須存在,否則 500 錯誤
?>
_once 變體:防止重複引入
<?php
// 類定義文件必須使用 _once
require_once 'classes/User.php';
require_once 'classes/Database.php';
// 即使多次寫入,類只會定義一次,避免 "Cannot redeclare class" 錯誤
include_once 'header.php';
include_once 'header.php'; // 第二次無效果
?>
路徑解析機制與最佳實踐
- 相對路徑:相對於**當前執行腳本**(入口文件)所在目錄,非被引入文件目錄。
- 絕對路徑(推薦):
require_once __DIR__ . '/../config/app.php';
require_once dirname(__FILE__) . '/lib/autoload.php'; // PHP 5.2 兼容
- include_path:設置後可省略路徑
include 'lib.php';,但**性能較差**(需遍歷多目錄查找),大型項目建議顯式路徑。
進階:動態引入與命名空間
<?php
// PSR-4 自動加載 (composer)
require_once __DIR__ . '/vendor/autoload.php';
use App\Models\User;
use App\Services\PaymentService;
// 運行時動態引入插件
$plugin = 'PaymentAlipay';
$file = __DIR__ . "/plugins/{$plugin}.php";
if (is_file($file)) {
require_once $file;
$class = "Plugins\\{$plugin}";
if (class_exists($class)) {
$instance = new $class();
}
}
?>
常見坑點
- BOM 頭導致輸出:被引入文件保存為 UTF-8 with BOM,會在引入處輸出隱形字符,破壞 Header/JSON 輸出。
- 變量作用域:include 在函數內調用時,引入文件繼承函數作用域(非全局)。
- HTTP 封裝協議風險:
include 'https://example.com/file.php'; 會執行遠端代碼,**極度危險**,確保 allow_url_include=Off。