intval境界値

1073 ワード

一.intval()と(int)
phpでは、intval()メソッドは(int)と同様に文字列フォーマットを整形することができ、2つの方法の違いはintval()が10進数、2進数、8進数、16進数などのデータに変換できるだけで、(int)は10進数に変換するだけで、intval()は10進数に変換することを黙認し、10進数だけを使う場合に(int)を使うのが良い選択です.
二.境界値
コードの中で私は受信した携帯電話の番号をintval()で整形に変えて、返した整形データがすべて1つの値になることを発見しました:
var_dump(intval('13800138000'));//  int 2147483647

これまでこんなことはなかったのに、なぜintvalがやんちゃになったのか、intval()を調べてみると、この値がintの境界値であることがわかりました.
             1.32ビットのシステム環境において、intval境界値は−21147483648〜2147483647である.
             2.64ビットのシステム環境において、intval境界値は−922337203685475808〜922337203685475807である.
よく考えてみると、以前は64ビットシステムで開発されていたが、11ビットの携帯電話番号はその境界値を超えていないので、この問題には気づかなかったが、現在は32ビットシステムを使っており、ローカルで遊ぶと問題が発生し、ポーズを上げている.
考えてみると、idなど2147483647を超えないデータはintval()でいいのですが、qq番号、携帯電話番号などの長い数字は他の方法で取得しなければなりません.
function getNum($str, $default = 0){
    return preg_match('/[\d]+/', $str, $int) ? $int[0]: $default;
}
$str = '13800138000';
var_dump(getNum($str)); //string '13800138000' (length=11)

解決できる限り、どんな方法でもいいです.