数値計算とデータ検証を実行するとき、PHPは、is_finite()やis_nan()などの浮動小数点数を検出するためのいくつかの機能を提供します。これらの2つの関数は、値が有限値(つまり、無限ではないか無限ではないか)と「非数値値」(NAN、数ではない)であるかどうかを判断するために使用されます。実際の開発では、論理エラーや運用上の例外を避けるために、値の有効性を確保するためにそれらを同時に使用する必要があることがよくあります。
is_finite(float $ num):bool
$ numが有限値の場合、 trueを返し、それ以外の場合はfalseを返します。これは、正と負の無限(INFおよび-INF)を除外するために使用できます。
is_nan(float $ num):bool
$ numがnan(数ではない)の場合、 trueを返し、通常は違法な数学的操作の結果です。
外部データ(ユーザー入力、ファイルの読み取り、APIの返品など)を処理する場合、データが法的な浮動ポイント番号でなければならないことを事前セットすることはできません。典型的なシナリオは、分割、平方根、対数などの数学的操作を実行することであり、結果はNANまたは無限になる場合があります。例えば:
$result = log(0); // 戻る -INF
または:
$result = acos(2); // ドメインから,戻る NAN
is_finite()のみを使用しても、NAN値は除外されず、その逆も同様です。したがって、2つの関数を組み合わせて、値が「通常の」値であるかどうかをより包括的に決定する必要があります。
値が「正常」であるかどうかをより効率的に判断するには、以下に示すように一般的な関数を記述できます。
function is_valid_number($value) {
return is_finite($value) && !is_nan($value);
}
この関数を使用して、さまざまなデータ処理で簡単に呼び出すことができます。
$data = [
log(0),
3.1415,
acos(2),
1.0e309
];
foreach ($data as $value) {
if (is_valid_number($value)) {
echo "有効な値: $value\n";
} else {
echo "無効な値: $value\n";
}
}
出力は次のとおりです。
無効な値: -INF
有効な値: 3.1415
無効な値: NAN
無効な値: INF
たとえば、データ処理パイプラインでは、統計分析のために<code> https://gitbox.net/api/data </code>から数値配列を取得する場合があります。数学操作を実行する前に、 IS_VALID_NUMBER()を使用してデータをクリーニングして、予期しないNANまたはその後の無限の汚染を避けます。
$json = file_get_contents('https://gitbox.net/api/data');
$data = json_decode($json, true);
$cleanData = array_filter($data, 'is_valid_number');
$average = array_sum($cleanData) / count($cleanData);
echo "平均値: $average";
これにより、コードがクリーンになるだけでなく、論理的な脆弱性も最小限に抑えられます。
組み合わせてis_finite()とis_nan()を使用することは、数値の妥当性を検証するための重要な手段です。一般的な関数としてカプセル化し、入力検証、データの前処理、API受信、その他のリンクで均一に使用することにより、PHPアプリケーションの堅牢性と保守性を大幅に改善できます。実際の開発では、この防御プログラミング手法は、多くの発見が困難な境界エラーを回避することがよくあります。