現象直觀對比
| 維度 | PHP 源文件 (.php) | 瀏覽器「查看網頁源代碼」 |
| 內容 | 混合 HTML + PHP 標籤 (<?php ... ?>) | 純 HTML / CSS / JS,無任何 PHP 標籤 |
| 變量 | $title = "首頁"; | 已替換為實際值 首頁 |
| 邏輯 | if ($login) { ... } | 只輸出滿足條件的 HTML 片段 |
| 數據庫 | $mysqli->query(...) | 查詢結果已渲染為表格/列表 |
本質原理:PHP 是「HTML 生成器」
- 請求到達:瀏覽器發起 HTTP Request
- 服務端解析:Web Server (Nginx/Apache) 將
.php 文件交給 PHP-FPM 進程
- 預處理執行:PHP 引擎**順序執行**所有
<?php ... ?> 代碼块,產生輸出緩衝區
- 輸出響應:最終輸出緩衝區內容(純文本,通常是 HTML)作為 HTTP Response Body 返回瀏覽器
- 瀏覽器渲染:瀏覽器**只見到最終 HTML**,完全不知情服務端發生了什麼
代碼演示
<!-- index.php -->
<?php
$user = ['name' => '張三', 'vip' => true];
?>
<html>
<body>
<h1>歡迎, <?= htmlspecialchars($user['name']) ?></h1>
<?php if ($user['vip']): ?>
<span class="badge">VIP 會員</span>
<?php endif; ?>
</body>
</html>
瀏覽器看到的源碼
<html>
<body>
<h1>歡迎, 張三</h1>
<span class="badge">VIP 會員</span>
</body>
</html>
關鍵認知點
- PHP 代碼不會傳給瀏覽器:安全性基石,邏輯、密鑰、SQL 全在服務端
- 「查看源碼」看到的是輸出結果:而非原始腳本,調試時請區分「服務端日誌」與「客戶端源碼」
- 模板引擎本質相同:Twig、Blade、Smarty 最終也編譯為 PHP 再執行
- AJAX 接口同理:返回 JSON/XML,瀏覽器源碼面板不顯示,需在 Network 面板查看
調試建議
- 服務端:
error_log()、Xdebug 斷點、var_dump() 輸出到日誌
- 客戶端:DevTools → Network → Response 查看原始響應體
- 模板調試:在模板中加入註釋
<!-- DEBUG: $var = {$var} --> 輸出到 HTML 註釋中