2016-11-24 10 views
-2

質問
ユーザ入力が整数であるかどうかを検証しようとしているときに、PHPで奇妙な動作が発生しました。PHPでキャストされる文字列

私は例えば

$int_var = (int)'12345A'; 

をintに文字列12345Aをキャストしようとすると、私は12345

はなぜPHPは、例外をスローが、静かに 'A' を省略されていないのですか?

+3

これはそのために設計されたものなのですか? –

+0

文字列をループして、文字が数字かどうかを確認する必要がありますか? –

+0

32ビットシステムを持ち、PHP_MAX_INTより大きい巨大なintが必要な場合は、後者のほうが優れています。 – RJParikh

答えて

2

PHP tries to convert整数型に文字列の最初の部分:

値が与えられているが文字列の最初の部分で始まります。文字列が有効な数値データで始まる場合、これが使用される値になります。それ以外の場合は、値は0(ゼロ)になります。

キャストされる変数がスカラーの場合、型キャスト機能は例外をスローしたり、他の方法で失敗したりすることは想定されていません。変数がオブジェクトの場合は通知をトリガーしますが、変換は実行されます。

あなたは$t変数は、数値が含まれている場合は、チェックis_numericを使用する場合:

if (is_numeric($t)) { 
    // ... 
} 

$tは(通常の場合)'1234'のような文字列であるかのことから、is_intを使用しないでください、タイプがstringですが、intではないため、is_intfalseを返します。

また、チェックの前にtrim$tを考慮してください。

$t = trim($t); 

ユーザーが" 123"のようなものを提出することができるからです。しかし、アプリケーションは通常、主要なスペースのために失敗してはいけません。

3

このようなキャストを行うと、PHPは数字以外の文字を取り除くなど、数値に変換するのに最善の努力をします。

あなたはそれがint型だことを確認したい場合にように、あなたは、is_int()を使用することができます。

$t = '12345A'; 
if (!is_int($t)) throw new Exception('Not an integer: ' . $t); 
+0

$ tは整数ではないので、これは失敗します。これは文字列です。受け入れられた答えを見てください。 – ChristianF

関連する問題