タイトル: A non well formed numeric value encountered
SEOタイトル: A non well formed numeric value encountered
| この記事の要点 |
|---|
|
エラー内容
|
A non well formed numeric value encountered |
PHP 7.1 以降で、数値として扱えない文字列を算術演算に使ったときに表示される Warning です。PHP 8 ではより厳しくなり、完全に数値でない文字列を渡すと TypeError になる場合があります。
発生条件 / 原因
- 数値に変換できない(先頭が数値だが末尾に非数字が含まれる)文字列を四則演算の対象にしたとき
- 例:
"10abc" + 5→ 値は15になるが Warning が出る - 例:
"1.5kg" * 2→ 値は3になるが Warning - DBから取得した値、HTTPリクエストパラメータ、CSV読み込みなど、外部からの文字列を直接演算しているケース
- 日付の差分計算で
"2024-01-01"をそのまま演算した
対処法
1. 明示的に数値型へキャストする
|
$result = (int) $value + 5; |
2. intval() / floatval() を使う
|
$result = intval($value) + 5; |
どちらも先頭から読み取れる数値部分のみ取り出し、警告は出しません。
3. 事前にバリデーションする
入力値が想定外の文字列の場合は弾く方が安全です。
|
if (!is_numeric($value)) { |
4. Laravel等のフレームワーク
Laravelなら request()->integer('key') や Validation の numeric ルールで入力時に型を保証できます。
|
$request->validate(['qty' => 'required|integer|min:1']); |
PHPバージョン別の挙動
| PHPバージョン | 挙動 |
|---|---|
| PHP 7.0以前 | 警告なしで暗黙変換 |
| PHP 7.1 – 7.4 | 「A non well formed numeric value encountered」Warning |
| PHP 8.0以降 | 部分数値はWarning、完全に非数値はTypeError |
注意点
- Warning なので動作自体は継続するが、本番ログを汚すので必ず対応する
- PHP 8 への移行時にこの警告が
TypeErrorに格上げされて落ちるケースがある error_reportingで抑制するのではなく、入力値を正しい型にする方向で直す