PHP の弱い型の安全性の問題

高洛峰
リリース: 2016-10-10 09:51:50
オリジナル
1106 人が閲覧しました

1. 型変換の問題

 intval();
 
    var_dump(intval('1asdfasd'));  //1
    var_dump(intval('awqw12'));  //0
    var_dump(intval(array()));    //0
    var_dump(intval(array('foo','val'))); //1
    var_dump(intval(0x1A)); //26  十六进制转换
    var_dump(intval('asdfqwer')); //0
ログイン後にコピー

intval 変換された値が文字列の場合はエラーは返されませんが、変換された値が空の場合は 2 つの状況があります。配列の場合は 0 が返され、それ以外の場合は 1 が返されます

注: PHP は 32 ビットのメモリを使用して、符号付きの場合は 4294967296 の数値を表現できます。

2. 組み込み関数の緩みの問題

switch();
 
     $i='3adcd';
     switch($i){
              case 1:
                     echo 'i is 1';
                     break;
              case 2:
                     echo 'i is 2';
                     break;
              case 3:
                     echo 'i is 3';
                     break;
              default:
                    echo 'i is default';
                    break;
     }
ログイン後にコピー

上記の結果は switch case 3 に入ります。なぜこのようなことが起こるのでしょうか? switch が数値型の場合、switch は実行時にパラメータを int クラスに変換します。上記では、最初に $i を入力すると、変換結果は 3 になります。 。 。

in_array();
    $arr = [0,1,2,3,'test'];
    var_dump(in_array('abd',$arr));    // true
    var_dump(in_array('1bc',$arr));    // true
ログイン後にコピー
なぜ上記の実行結果はこのようになるのでしょうか?後でマニュアルを調べてみると、in_array のデフォルトでは、値が等しいかどうかのみを比較し、型が等しいかどうかは比較しないという公式の記述があります。の値が同じであるため、上記の結果が得られます。この結果に対して、in_array 関数の 3 番目のパラメーターを True に設定すると、厳密な比較方法が得られます。

以上は、日々の開発において注意すべき点です。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!