質問
ユーザ入力が整数であるかどうかを検証しようとしているときに、PHPで奇妙な動作が発生しました。PHPでキャストされる文字列
私は例えば
$int_var = (int)'12345A';
をintに文字列12345A
をキャストしようとすると、私は12345
はなぜPHPは、例外をスローが、静かに 'A' を省略されていないのですか?
質問
ユーザ入力が整数であるかどうかを検証しようとしているときに、PHPで奇妙な動作が発生しました。PHPでキャストされる文字列
私は例えば
$int_var = (int)'12345A';
をintに文字列12345A
をキャストしようとすると、私は12345
はなぜPHPは、例外をスローが、静かに 'A' を省略されていないのですか?
PHP tries to convert整数型に文字列の最初の部分:
値が与えられているが文字列の最初の部分で始まります。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合は、値は0(ゼロ)になります。
キャストされる変数がスカラーの場合、型キャスト機能は例外をスローしたり、他の方法で失敗したりすることは想定されていません。変数がオブジェクトの場合は通知をトリガーしますが、変換は実行されます。
あなたは$t
変数は、数値が含まれている場合は、チェックis_numeric
を使用する場合:
if (is_numeric($t)) {
// ...
}
$t
は(通常の場合)'1234'
のような文字列であるかのことから、is_int
を使用しないでください、タイプがstring
ですが、int
ではないため、is_int
はfalse
を返します。
また、チェックの前にtrim
明$t
を考慮してください。
$t = trim($t);
ユーザーが" 123"
のようなものを提出することができるからです。しかし、アプリケーションは通常、主要なスペースのために失敗してはいけません。
このようなキャストを行うと、PHPは数字以外の文字を取り除くなど、数値に変換するのに最善の努力をします。
あなたはそれがint型だことを確認したい場合にように、あなたは、is_int()
を使用することができます。
$t = '12345A';
if (!is_int($t)) throw new Exception('Not an integer: ' . $t);
$ tは整数ではないので、これは失敗します。これは文字列です。受け入れられた答えを見てください。 – ChristianF
これはそのために設計されたものなのですか? –
文字列をループして、文字が数字かどうかを確認する必要がありますか? –
32ビットシステムを持ち、PHP_MAX_INTより大きい巨大なintが必要な場合は、後者のほうが優れています。 – RJParikh