準備 PHP 開發職位面試?這 11 道高頻題涵蓋語言基礎、架構模式、前端整合、資料庫操作、錯誤處理等核心領域。本文不僅給出標準答案,更補充面試官追問方向與實戰陷阱,助你從「背得出」進階到「講得透」。
標準答: PHP (Hypertext Preprocessor) 是一種**服務端腳本語言**,專為 Web 開發設計,可嵌入 HTML,執行於伺服器生成動態頁面輸出給瀏覽器。
加分點:
標準答: MVC 將應用分離為三層:
追問陷阱: 「Fat Model, Skinny Controller」原則——業務邏輯下沉 Model/Service,Controller 僅做請求分發與響應組裝。
標準答: 三種:
<link rel="stylesheet" href="style.css"> (推薦,可緩存、復用)。<style>...</style> (單頁特有樣式)。<div style="color:red"> (最高優先級,難維護,慎用)。補充: `@import` 歸屬外部/內部方式,但會阻塞渲染,現代構建工具 (Vite/Webpack) 會打包合併。
標準答: **不支援類多重繼承** (單繼承),關鍵字 extends。但提供兩種機制實現代碼復用:
use TraitName; 將方法組合進類 (PHP 5.4+),解決單繼承限制。implements InterfaceA, InterfaceB 定義契約,可多實現。經典追問: Trait 衝突解決 (insteadof, as)、鑽石繼承問題。
| 特性 | echo | |
|---|---|---|
| 返回值 | 無 (void) | 總是返回 1 (可用於表達式) |
| 參數 | 可接受多參數 echo 'a', 'b'; (無逗號則為連接) | 僅接受單一參數 |
| 速度 | 極微快 (無返回值開銷) | 略慢 |
| 用法 | 語言構造,非函數 | 語言構造,行為似函數 |
實戰: 大量輸出用 echo;需在表達式中輸出 (罕見) 才用 print。
| 維度 | GET | POST |
|---|---|---|
| 資料位置 | URL 查詢字串 (?a=1&b=2) | HTTP Body |
| 長度限制 | 瀏覽器/伺服器限制 (~2KB~8KB) | 受 post_max_size 限制 (預設 8MB,可調) |
| 可見性 | 明文顯示於地址欄/歷史/日誌 | 不直接顯示 (但非加密,抓包可見) |
| 冪等性 | **應為冪等** (查詢、分頁) | **非冪等** (提交、刪除、修改) |
| 緩存 | 可被瀏覽器/CDN 緩存 | 預設不緩存 |
| CSRF 風險 | 低 (幂等操作) | **高,必須配合 Token 防護** |
核心誤區: 「POST 就安全」——**HTTPS 才是傳輸層安全基石**,POST 只是不把參數放 URL 而已。
getimagesize($path):返回 [width, height, type, attr, bits, channels, mime],**最常用**。imagesx($resource) / imagesy($resource):需先用 imagecreatefrom* 建立資源,**僅適用 GD 資源**,不支援直接讀檔。陷阱: getimagesize 會下載遠程圖片 (若允許 allow_url_fopen),可能導致請求卡死,生產環境建議用 cURL 先下載再檢測。
標準答: PHP Extension and Application Repository,**歷史舊套件倉庫**,現已基本被 **Composer (Packagist)** 取代。面試若問及,答明「早期套件管理工具,現棄用,改用 Composer」即可展現時代感。
標準答: **資料庫僅存儲元數據 (路徑、名稱、大小、MIME、上傳者、時間)**,實體檔案存檔案系統/對象存儲 (OSS/S3/MinIO)。
關鍵配置 (php.ini):
upload_max_filesize = 100M ; 單檔上限
post_max_size = 110M ; 必須 > upload_max_filesize
max_execution_time = 300 ; 大檔上傳需更長時間
memory_limit = 256M ; 避免處理大檔 OOM
進階: 分片上傳、斷點續傳 (Plupload/Uppy)、異步轉碼 (FFmpeg)、CDN 加速。
| 級別 | 常數 | 行為 | 典型場景 |
|---|---|---|---|
| 錯誤 | E_ERROR | 腳本終止執行 | 實例化不存在的類、require 失敗 |
| 警告 | E_WARNING | 腳本繼續執行 | include 失敗、參數類型錯誤 |
| 提示 | E_NOTICE / E_DEPRECATED | 腳本繼續 | 使用未定義變數、呼叫棄用函數 |
| 嚴重 | E_PARSE | 編譯階段終止 | 語法錯誤 |
現代最佳實踐:
error_reporting(E_ALL) + display_errors=On。display_errors=Off + log_errors=On + 統一日誌系統 (Monolog -> ELK/Loki)。set_error_handler() 統一轉為 Exception,配合 try-catch 處理。Throwable 介面統一 Error 與 Exception。<?php
// 全域常量 (命名慣例全大寫)
define('APP_VERSION', '1.0.0');
define('MAX_UPLOAD_SIZE', 10 * 1024 * 1024); // 運算式支援 PHP 5.6+
// 類常量 (推薦用於類相關配置)
class Config {
public const DB_DRIVER = 'mysql';
public const CACHE_TTL = 3600;
}
// 運行時常量 (極少用)
const RUNTIME_CONST = 'value';
?>
區別: define() 運行時定義、支援動態名稱;const 編譯時定義、語法更嚴格、效能略高、支援命名空間。
答案: JS 觸發 form.submit()、AJAX (Fetch/axios) 提交、Enter 鍵觸發 (單輸入框表單)、隱藏 <input type="submit" style="display:none"> 保留語義。
<!-- 純 JS 方式 -->
<a href="javascript:document.forms[0].submit();">提交</a>
<!-- 或現代寫法 -->
<button type="button" onclick="document.getElementById('myForm').submit()">提交</button>
背誦答案只是入場券,**能說出「為什麼」、「還有什麼替代方案」、「生產環境怎麼做」**才是通關鑰匙。