HexDecは、入力として文字列の形の16進数のみを受け入れます。非弦タイプが渡された場合、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()関数を使用して、文字列が16進数で合法かどうかを検出することは良い習慣です。
phpstormなどの最新のIDEを使用する場合は、ブレークポイントを設定し、プログラムの段階的なデバッグを設定し、変数がヘックスデックに渡される前後の変更を観察することをお勧めします。可変タイプと値のリアルタイム監視は、予期しない入力またはデータの汚染を発見するのに役立ちます。
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を使用して、16進数から小数までの迅速な検証を実行して、PHP出力の結果が正確であることを確認できる場合があります。
上記の手順を通じて、ヘックスデックの呼び出しの問題をすばやく見つけ、暗黙の型変換、違法な入力、または間違ったロジックによって引き起こされるトラブルを避けることができます。入力チェック、ログキャプチャ、および単体テストを念頭に置いておくことは、コードの品質を改善し、デバッグ効率を向上させる鍵です。
<?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";
}
?>