hexdec只接受字符串形式的十六進制數作為輸入。如果傳入非字符串類型,PHP 會先自動轉換,但這可能導致結果異常。例如:
<?php
// 正確用法,字符串輸入
echo hexdec("1a"); // 輸出 26
// 數字輸入,自動轉換為字符串 "26"
echo hexdec(26); // 輸出 38,因為 26 會被當作字符串 "26" 處理
注意這種自動類型轉換可能導致的誤解,確認輸入參數的類型是調試的第一步。
很多時候, hexdec返回不符合預期的結果,是因為輸入本身不正確。此時可以在調用前打印數據,確認輸入內容:
<?php
$hexString = "1g"; // 非法字符 g
if (!ctype_xdigit($hexString)) {
echo "輸入字符串包含非十六進製字符: $hexString\n";
}
echo hexdec($hexString); // 輸出 1,因為遇到非法字符后停止转换
利用ctype_xdigit()函數預先檢測字符串是否合法十六進制是個好習慣。
如果你使用像PhpStorm 這類現代IDE,建議設置斷點,單步調試程序,觀察變量傳入hexdec前後的變化。對變量類型和值的實時監控,可以幫助你發現意外的輸入或者數據污染。
雖然hexdec不會拋出異常,但你可以藉助PHP 的錯誤日誌和異常處理機制,圍繞調用點寫一些安全代碼,例如:
<?php
set_error_handler(function($errno, $errstr) {
echo "錯誤捕獲: [$errno] $errstr\n";
});
$input = "zz123";
if (!ctype_xdigit($input)) {
trigger_error("輸入非十六進製字符串: $input", E_USER_WARNING);
}
echo hexdec($input);
通過日誌發現輸入異常,有助於定位調用鏈。
將hexdec調用封裝成函數,給它設計單元測試用例,覆蓋正常、邊界和異常輸入,確保功能健壯:
<?php
function safeHexDec(string $hex) : int {
if (!ctype_xdigit($hex)) {
throw new InvalidArgumentException("非合法的十六進製字符串: $hex");
}
return hexdec($hex);
}
然後用PHPUnit 寫測試:
<?php
use PHPUnit\Framework\TestCase;
class HexDecTest extends TestCase {
public function testValidHex() {
$this->assertEquals(26, safeHexDec("1a"));
}
public function testInvalidHex() {
$this->expectException(InvalidArgumentException::class);
safeHexDec("1g");
}
}
有時你可以使用在線工具或命令行printf進行十六進制轉十進制的快速驗證,確保PHP 輸出的結果是準確的。
通過以上幾個步驟,你能快速定位hexdec調用中的問題,避免因隱式類型轉換、非法輸入或錯誤邏輯帶來的麻煩。牢記輸入檢查、日誌捕獲和單元測試,是提高代碼質量和調試效率的關鍵。
<?php
// 示例:安全調用 hexdec 的函數
function safeHexDec(string $hex): int {
if (!ctype_xdigit($hex)) {
throw new InvalidArgumentException("非合法的十六進製字符串: $hex");
}
return hexdec($hex);
}
try {
$value = safeHexDec("1a3f");
echo "轉換結果: $value\n";
} catch (InvalidArgumentException $e) {
echo "錯誤: " . $e->getMessage() . "\n";
}
?>