首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 面試題精選(一):基礎語法、時間處理、數據庫優化、會話管理與輸出控制

     編輯:PHP 相關知識

整理高頻 PHP 面試題,附標準答案與核心考點解析,適合初中級工程師查漏補缺。

1. 打印前一天日期時間

echo date('Y-m-d H:i:s', strtotime('-1 day'));

考點: date() 格式化字符、`strtotime()` 相對時間解析。常用格式:Y 年、m 月、d 日、H 24時、i 分、s 秒。

2. echo / print / print_r / var_dump / var_export 區別

函數/語句類型返回值輸出內容典型用途
echo語言構造無一或多個字符串模板輸出、性能敏感場景
print語言構造恒為 1單個字符串表達式上下文需返回值時
print_r函數bool數組/對象結構(可讀)調試輸出
var_dump函數無類型+值+長度(詳盡)深度調試、類型檢查
var_export函數mixed合法 PHP 代碼表示導出配置、緩存生成代碼

3. 常見 PHP 模板引擎

  • Smarty:老牌、編譯型、插件豐富、學習曲線平緩
  • Blade (Laravel):語法優雅、繼承佈局、編譯為原生 PHP、零性能損耗
  • Twig (Symfony):安全(沙箱)、繼承、宏、國際化、嚴格語法
  • ThinkPHP 內置模板:標籤庫豐富、XML 風格、框架深度整合

4. 版本控制工具

  • Git:分布式、分支廉價、生態統治級、現代標配
  • SVN (Subversion):集中式、目錄級權限、大文件友好、遺留項目仍在用
  • Mercurial (Hg):分布式、命令簡潔、Windows 支持早期較好、現較少見

5. 字符串反轉

strrev($str); // 僅支持單字節字符集,UTF-8 中文會按字節反轉導致亂碼
// UTF-8 安全反轉
function mb_strrev($str) {
    $chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
    return implode('', array_reverse($chars));
}

6. MySQL 優化綜合策略

  1. 架構層: 讀寫分離、分庫分表、冷熱數據分離、集群/主從/雙主
  2. 設計層: 適度反範式化減少 JOIN、選擇合適引擎、字段類型最小化、冗余字段換查詢速度
  3. 索引層: 覆蓋索引、最左前綴、避免隱式轉換、定期 ANALYZE TABLE 更新統計信息
  4. SQL 層: EXPLAIN 分析執行計劃、避免 SELECT *、LIMIT 分頁優化(游標/延遲關聯)、拆分大事務、緩存熱點查詢
  5. 系統層: innodb_buffer_pool_size 設置物理內存 60-80%、innodb_flush_log_at_trx_commit=2 平衡性能安全、慢查詢日誌分析

7. 獲取客戶端 IP 與服務器 IP

// 客戶端 IP (考慮代理)
function getClientIp() {
    $headers = ['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'];
    foreach ($headers as $h) {
        if (!empty($_SERVER[$h])) {
            $ips = explode(',', $_SERVER[$h]);
            return trim($ips[0]);
        }
    }
    return 'unknown';
}

// 服務器公網 IP
$serverIp = gethostbyname($_SERVER['SERVER_NAME']);
// 或調用外部 API: file_get_contents('https://api.ipify.org')

8. 修改 Session 生命周期

// php.ini 全局設置
session.gc_maxlifetime = 86400  ; 24小時
session.cookie_lifetime = 86400 ; 瀏覽器關閉不銷毀

// 代碼動態設置 (需在 session_start() 前)
ini_set('session.gc_maxlifetime', 86400);
ini_set('session.cookie_lifetime', 86400);
session_set_cookie_params(86400);
session_start();

9. SQL:發帖數 Top 10 用戶

SELECT username, posts
FROM members
ORDER BY posts DESC
LIMIT 10;

原題錯誤: GROUP BY id 無意義,count(posts) 應為直接排序字段 posts。

10. 獲取當前執行腳本路徑含參數

echo $_SERVER['SCRIPT_NAME'] . '?' . $_SERVER['QUERY_STRING'];
// 或
echo 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

11. mysql_fetch_row() vs mysql_fetch_array()

  • mysql_fetch_row():返回**數字索引數組** [0=>'val1', 1=>'val2']
  • mysql_fetch_array():返回**混合索引數組** [0=>'val1', 'field1'=>'val1', 1=>'val2', 'field2'=>'val2'],默認 MYSQL_BOTH,可指定 MYSQL_NUM/MYSQL_ASSOC

注意: `mysql_*` 已移除,請用 mysqli_fetch_row()/mysqli_fetch_array() 或 PDO fetch(PDO::FETCH_NUM)/FETCH_ASSOC/FETCH_BOTH。

12. 類型比較陷阱

$str1 = null;  $str2 = false;  var_dump($str1 == $str2);  // true (鬆散比較)
$str3 = '';    $str4 = 0;    var_dump($str3 == $str4);  // true
$str5 = 0;     $str6 = '';   var_dump($str5 === $str6); // false (嚴格比較: 類型不同)

鐵律: **永遠使用 `===` / `!==`**,除非極其確定需要類型轉換語義。

13. 引用與 unset 行為

$test = 'hello';
$abc = &$test;  // $abc 引用 $test
unset($test);   // 僅銷毀變量名 $test,引用內容 'hello' 仍存在,$abc 可訪問
echo $abc;      // 輸出 'hello'

核心: `unset` 斷開「變量名 → 內容」的綁定,**不銷毀內容本身**(引用計數 > 0 時)。

—— 未完待續,下期深入 OOP、框架原理、性能調優、安全防禦 ——

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved