在 PHP 中比較字串時,開發者常面臨選擇:使用 == 運算子還是 strcmp() 函式?兩者行為差異巨大,選錯可能導致邏輯錯誤。本文深度解析兩者機制與適用場景。
int strcmp(string $str1, string $str2)
| 回傳值 | 含義 |
|---|---|
| 0 | 兩字串完全相等 |
| > 0 | $str1 大於 $str2(ASCII 碼比較) |
| < 0 | $str1 小於 $str2 |
<?php
$str1 = "a";
$str2 = "b";
$str3 = "ccc";
$str4 = "CCC";
echo strcmp($str1, $str2); // -1 (a < b)
echo strcmp($str3, $str4); // 1 (小寫 c ASCII 99 > 大寫 C ASCII 67)
?>
注意:strcmp() 進行二進位安全比較,嚴格區分大小寫。
<?php
$a = "joe";
$b = "jerry";
if ($a != $b) {
echo "不相等";
} else {
echo "相等";
}
// 輸出:不相等
?>
<?php
var_dump("123" == "123.0"); // true (數值比較)
var_dump("abc" == 0); // true (字串轉數值為 0)
var_dump("0e12345" == "0"); // true (科學記號視為 0)
?>
風險:== 會嘗試將字串轉為數值比較,導致非預期的相等判定。
| 比較維度 | strcmp() | == 運算子 |
|---|---|---|
| 大小寫敏感度 | 敏感 | 敏感 |
| 型別轉換 | 無 (二進位比較) | 有 (嘗試數值轉換) |
| 回傳資訊 | 大小關係 (-1,0,1) | 布林值 (true/false) |
| 適用場景 | 排序、精確比對、安全驗證 | 簡單相等檢查、表單驗證 |
| 效能 | 略慢 (函式呼叫) | 極快 (內建運算子) |
<?php
echo strcasecmp("Hello", "hello"); // 0 (相等)
?>
<?php
$a = "123";
$b = 123;
var_dump($a == $b); // true
var_dump($a === $b); // false (型別不同:string vs int)
?>
<?php
// 適用於密碼雜湊、Token 驗證等安全敏感場景
if (hash_equals($known_string, $user_input)) {
// 安全通過
}
?>
hash_equals() 或 password_verify()strcmp() 或 strnatcmp() (自然排序)=== 確保型別一致,避免 "0" == false 陷阱strcasecmp() 或統一轉大小寫後用 ===Collator::compare() (intl 擴展) 處理 Unicode 排序規則<?php
// ❌ 錯誤:驗證碼比對
if ($_POST['captcha'] == $_SESSION['captcha']) { ... }
// ✅ 正確:嚴格比對
if ($_POST['captcha'] === $_SESSION['captcha']) { ... }
// ❌ 錯誤:API 簽名驗證
if ($signature == $expected) { ... }
// ✅ 正確:防時序攻擊
if (hash_equals($signature, $expected)) { ... }
?>
PHP 字串比較看似簡單,實則暗藏陷阱。strcmp() 提供精確的二進位比較與大小關係;== 便利但易因型別轉換產生 Bug;=== 是日常開發的安全基線;hash_equals() 則是安全關鍵場景的必備。根據業務語境選擇正確工具,是寫出健壯 PHP 程式的關鍵。