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

五道經典 PHP 面試陷阱題:你中招了嗎?

     編輯:PHP 綜合知識

前言

PHP 的弱類型與隱式轉換機制造就了許多「反直覺」的行為,這些特性常成為面試考察重點。本文精選五道高陷阱題,逐層拆解底層原理,助你避開認知盲區。


題目一:字符串鍵名與整數比較的類型轉換陷阱

$arr = [0 => 1, 'aa' => 2, 3, 4];
// 實際結構:[0=>1, 'aa'=>2, 1=>3, 2=>4]

foreach ($arr as $key => $val) {
    print($key == 'aa' ? 5 : $val);
}
// 你的答案?

陷阱解析

輸出:5534(而非直覺的 1534)

原因:== 觸發弱類型比較。當 string 比較 int 時,PHP 將字符串轉為整數:'aa' → 0。故 0 == 'aa' → true,首個元素鍵名 0 也匹配成功。

修正方案

// 使用全等號 === 避免類型轉換
print($key === 'aa' ? 5 : $val); // 輸出:1534

題目二:printf 返回值的隱藏行為

$i = '11';
printf("%d\n", printf("%d", printf("%d", $i)));
// 輸出?

陷阱解析

輸出:1121

關鍵點:printf 不僅輸出,返回輸出字符長度。

  1. 內層 printf("%d", $i) → 輸出 11,返回 2(長度)
  2. 中層 printf("%d", 2) → 輸出 2,返回 1
  3. 外層 printf("%d\n", 1) → 輸出 1 + 換行

最終輸出流:11 + 2 + 1\n = 1121\n


題目三:邏輯運算符短路與賦值返回值

$a = 3; $b = 5;
if ($a = 5 || $b = 7) {
    $a++; $b++;
}
echo $a . ' ' . $b; // 結果?

陷阱解析

輸出:1 6

三層陷阱:

  1. = vs ==:此處為賦值而非比較
  2. 短路求值:$a = 5 結果為 5(真),|| 短路,$b = 7 不執行
  3. 賦值表達式返回值參與邏輯運算:$a = 5 返回 5,作為 if 條件被轉為 bool(true),進入分支

分支內:$a++ 將 $a 從 5 變 6,但 echo $a 時 $a 是 bool(true) 轉字符串 '1'!
關鍵:$a = 5 || ... 中 $a 接收的是整個邏輯表達式的結果 true,而非 5!

// 等價邏輯
$a = (5 || ($b = 7)); // $a = true
// 所以 $a++ 後 $a 變為 1 (true->int 1),echo 輸出 '1'
$b 保持 5,未執行 $b=7,故輸出 6

題目四:static 變量與前後置遞增優先級

$count = 5;
function get_count() {
    static $count = 0;
    return $count++;
}
++$count;        // 全局 $count 變 6
get_count();     // 靜態 $count: 0→1,返回 0
echo get_count(); // 靜態 $count: 1→2,返回 1
// 輸出?

陷阱解析

輸出:1(非直覺的 2)

關鍵點:

  • static $count 與全局 $count 完全無關,各自獨立
  • return $count++ 是後置遞增:先返回當前值,再自增
  • 首次調用返回 0,第二次返回 1

題目五:count() 對非數組值的行為

$a = count("567") + count(null) + count(false);
echo $a; // 結果?

陷阱解析

輸出:2

參數count() 結果說明
"567"1非數組標量視為 1 個元素
null0null 計數為 0
false1布爾值視為 1 個元素(PHP 7.2+ 棄用警告)

1 + 0 + 1 = 2


核心知識點總結

  1. 嚴格比較:業務邏輯判斷優先用 ===/!==
  2. 函數返回值:熟知常用函數副作用(如 printf、count、array_search)
  3. 運算符優先級:賦值 = 低於邏輯 ||,但高於 or
  4. 靜態變量作用域:static 只在函數內保持狀態,不受外部同名變量影響
  5. 遞增遞減:++$a 返回新值,$a++ 返回舊值

這些陷阱本質上考察的是對 PHP 類型系統、運算符語義、內部實現的深度理解。實戰中開啟 declare(strict_types=1)、使用靜態分析工具可大幅降低此類風險。

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