PHP開発者が必ずと言っていいほど間違える操作を詳しく解説

黄舟
リリース: 2023-03-06 13:04:01
オリジナル
1586 人が閲覧しました

1. はじめに

最近、PHP が数学的な演算を行うために、痛くも痒くもない小さな問題がいくつか発生しました。

千マイルの堤防がアリの巣で崩壊。型変換を追加すると簡単に解決しますが、このまま放置するわけにはいかないと思います。

特に、PHP を使用して 財務計算を行ったり、インターフェース計算や強力な言語ドッキングを書いたりする学生は、より注意を払う必要があります。

大したことではありません、細部が成功するか失敗するかを決定します。注意深く研究した後、確かに多くのヒントがあり、私も学びました。

php が弱い型付け言語であることを本当に知っていますか?

少し前に、PHP カーネルについて研究し、PHP 変数の基礎となるストレージ構造について詳しく理解しましたが、さまざまな種類の値の演算プロセスと変換プロセスを完全には理解していませんでした。変数の型のこと。

これは実際には、私たちの インテリジェント PHP [自動型変換] の問題です。これは、弱い型指定言語としての PHP の能力でもあります

(以下に5つの例があります。どれも非常に単純な操作ですが、理由がわからないかもしれません)

2. プロセス分析

例1

まず、このブログを書くきっかけとなった、私が遭遇した問題(簡略化)を見てみましょう。

  $a = '1.11';
  $b = '0.11';
  var_dump($a);//string(4) "1.11" 
  var_dump($b);//string(4) "0.11" 
  $re = $a - $b;
  var_dump($re);//float(1)
ログイン後にコピー

注: 2 つの変更が発生しました。
1. 文字列を減算して浮動小数点型に変換します
2. 被減数はすべて小数点以下 2 桁で、結果は小数点以下になります [アプリでは表示に小数点以下 2 桁が必要なため、ここでもバグが発生します]
同じ原則として、小数点を含まない文字列数値を減算すると、結果は int

 $a = '11';
  $b = '1';
  var_dump($a);//string(4) "11" 
  var_dump($b);//string(4) "1" 
  $re = $a - $b;
  var_dump($re);//int(10)
ログイン後にコピー

結論:
1. PHP の基本的な操作中に、型変換が自動的に実行され、小数点は float に変換され、整数は int に変換されます。
2. 数値の小数点以下の桁数を制限する必要がある場合は、必ずその制限に対処してください。 number_format();

はすでに始まっています。この型変換について話しましょう。

例2
質問: 次のことは本当ですか、それとも嘘ですか

    var_dump(0123 == 123);  
    var_dump('0123' == 123);  
    var_dump('0123' === 123);
ログイン後にコピー

答えは何ですか? ?
false;true;false
分析:
=== の強い判定により型比較が追加されるため、3 番目が false であることは誰でも簡単に推測できると思います
ここで注意が必要な点が 2 つあります。一方では、PHP の最下位層は 0 で始まる整数値を 8 進数であると見なします。他方では、sting を int に変換するときに、先頭の 0 が削除されます
var_dump(0123 == 123); false の場合、PHP は 0123 をデフォルトとして扱います。8 進数として処理されます。実際の 10 進数への変換は 83 です。明らかに、これは等しくありません。
var_dump('0123' == 123); // ここで true php は、'0123' を数値に変換し、デフォルトで前の 0 を削除すると、123==123 になります
var_dump('0123' == = 123); // false 明らかに、上記の質問では数値と​​文字列の型が矛盾していると述べています。
結論:
1. 0で始まる整数はPHPによって8進数として扱われます
2. 同僚の例1の結論1、文字列は演算中に自動的に型変換を実行し、先頭の0は削除されます


例 3
以下の $x の結果は何ですか:

      $x = NULL;
      if ('0xFF' == 255) {
          $x = (int)'0xFF';
      }
      $x = ?
ログイン後にコピー

答案是什么呢??
$x=0而不是255
注意点:
首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff = 255。PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。
但是$x = (int)'0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0
结论:
1.0开头的整形数字PHP会当作十六进制来处理
2. string->int的过程,是将字符串从左向右进行转换,遇到非数字字符则停止。

事例四
经过下面的运算 $x的值应该是多少?

  $x = 3 + "15%" + "$25"
ログイン後にコピー

答案是什么呢?? 18
注意点:其实就是前边的所提到的点。3+15+0=18(0时因为从左往右取数字嘛,遇到非数字停止,没有当然为0)
事例五(无关类型转换,但也很有意思)

 $a = true && false;
  var_dump($a);
  $a = true and false;
  var_dump($a);
ログイン後にコピー

答案是什么呢??
false;true

为什么呢?是对运算符优先级的一个理解,哈哈,提醒到这里自己去查查吧~

事例六

  $arr = array(0,1,2,3);
  foreach ($arr as $key => $value) {}
  var_dump(current($arr));//最后指针停留在数组结尾,取不到值了输出false

  $arr = array(0,1,2,3);
  foreach ($arr as $key => $value) { 
  //$arr其实是进行了一次传值,用的是$arr_copy 
        $arr[$key] = $value;//进行了改值,则发生分离现象
  }
  var_dump(current($arr));//输出1
ログイン後にコピー

输出false 与 1;(PHP5.6环境下,php7已经做了修改);

那这个又是为什么呢?【和PHP内核有关,变量分离改变】

以上がPHP開発者が必ずと言っていいほど間違える操作を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート