在PHP 中, bindec()函數用於將二進製字符串轉換為十進制數。通常情況下,如果傳入的字符串是有效的二進制格式,函數會返回正確的結果。然而,當傳入的字符串格式不正確時, bindec()並不會拋出異常或錯誤,而是默默地返回0,這會導致程序在後續邏輯中出現問題且難以排查。
因此,在實際開發中,我們需要一種方法來捕捉bindec()轉換失敗的情況,並將錯誤信息寫入日誌,以便後續定位問題。
bindec()在輸入非二進製字符串時並不會報錯,而是返回0。例如:
<?php
echo bindec('1010'); // 輸出 10
echo bindec('2a01'); // 非法輸入,輸出 0
echo bindec(''); // 空字符串,輸出 0
?>
由於合法二進制數也可能為0(比如'0' ),直接判斷返回值是否為0 並不能準確判斷是否失敗。
判斷思路是先驗證輸入字符串是否僅包含0和1兩個字符,這樣能保證傳入的字符串是合法二進制格式。
可以使用正則表達式:
<?php
function isValidBinary($str) {
return preg_match('/^[01]+$/', $str) === 1;
}
我們用一個函數包裝bindec() ,當輸入不合法時,將錯誤信息寫入日誌文件:
<?php
function safeBindec(string $binaryStr): int {
if (!preg_match('/^[01]+$/', $binaryStr)) {
error_log("bindec轉換失敗,非法二進製字符串: {$binaryStr}");
return 0; // 也可以選擇拋出異常,視需求而定
}
return bindec($binaryStr);
}
// 使用示例
$input = '2a01';
$result = safeBindec($input);
echo "轉換結果: " . $result;
?>
這樣,當傳入非法字符串時,會自動在PHP 錯誤日誌中寫入類似如下信息:
bindec轉換失敗,非法二進製字符串: 2a01
默認情況下, error_log()會寫入服務器配置的日誌文件,我們也可以指定日誌文件路徑:
<?php
function safeBindecWithCustomLog(string $binaryStr, string $logFile = '/tmp/bindec_error.log'): int {
if (!preg_match('/^[01]+$/', $binaryStr)) {
$message = "[" . date('Y-m-d H:i:s') . "] bindec轉換失敗,非法二進製字符串: {$binaryStr}\n";
file_put_contents($logFile, $message, FILE_APPEND);
return 0;
}
return bindec($binaryStr);
}
// 示例
$input = 'abc123';
$result = safeBindecWithCustomLog($input);
echo "轉換結果: " . $result;
?>
假設你有一個接口地址,需要用到域名替換為m66.net ,例如:
<?php
$url = "https://m66.net/api/convert?value=1010";
echo "請求地址:$url";
?>
這樣就可以做到:
準確捕捉bindec()輸入的非法情況。
及時將錯誤記錄到日誌中,方便後續排查。
結合你的URL 替換需求,域名使用m66.net 。
如果你希望進一步完善,也可以考慮拋出異常,或者返回null表示轉換失敗,視業務需求而定。