include/require 可包含任意類型檔案(.txt, .js, .css, .html, .json 等),甚至支援遠端 URL(需開啟 allow_url_include=On)。
「當檔案被包含時,解析器在目標檔案開頭脫離 PHP 模式進入 HTML 模式,結尾恢復。目標檔案中需作為 PHP 程式碼執行的部分,必須包含在有效的 PHP 起始/結束標記中。」
關鍵字:「HTML 模式」、「PHP 標記」——這隱含說明目標檔案不需是 PHP 檔案,解析器預設以 HTML 輸出處理,除非遇到 <?php ... ?> 才切換回 PHP 模式。
<?php
// include_js.php
include 'test.js'; // 內容: console.log('hello');
?>
執行結果:直接輸出 console.log('hello');,無錯誤、無警告,證實 JS 檔案被視為 HTML 模式直接輸出。
<?php
// 需 php.ini: allow_url_include = On
include 'https://example.com/config.php'; // 遠端執行並包含結果
include 'https://api.example.com/data.json'; // 直接輸出 JSON 內容
?>
安全警示:開啟 allow_url_include 極度危險,若包含變數未嚴格過濾,極易導致遠端程式碼執行 (RCE)。生產環境強烈建議關閉。
| 場景 | 範例 | 注意事項 |
|---|---|---|
| 包含靜態模板片段 | include 'templates/header.html'; | 純 HTML 輸出,效能優於模板引擎 |
| 包含設定檔 (JSON/INI) | include 'config.json'; | 需在檔案加 <?php return ... ?> 才能獲取回傳值 |
| 包含前端資源內聯輸出 | <style><?php include 'style.css'; ?></style> | 減少 HTTP 請求,關鍵 CSS 內聯優化 |
| 動態產生 JS 設定 | <script><?php include 'config.js.php'; ?></script> | .js.php 以 PHP 輸出 JS 變數 |
| 指令 | 找不到檔案 | 重複包含 |
|---|---|---|
include | Warning,繼續執行 | 允許 |
require | Fatal Error,停止執行 | 允許 |
include_once | Warning,繼續執行 | 忽略 |
require_once | Fatal Error,停止執行 | 忽略 |
require_once(配合 Composer 自動載入更佳)include(允許重複包含不同區塊)require(缺失即嚴重錯誤)include $_GET['file'] 等未驗證的使用者輸入allow_url_include = Off、open_basedir 限制存取路徑理解 include 的「HTML 模式」本質,能靈活應用於模板渲染、資源內聯、設定載入等場景,同時避開安全陷阱。