Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung der Vorgänge, bei denen PHP-Entwickler fast immer Fehler machen

Ausführliche Erklärung der Vorgänge, bei denen PHP-Entwickler fast immer Fehler machen

黄舟
黄舟Original
2018-05-29 10:27:561516Durchsuche

1. Vorwort

Vor kurzem bin ich auf einige kleinere Probleme gestoßen, die geringfügig und harmlos sind, weil PHP mathematische Operationen ausführt.

Eine tausend Meilen lange Böschung stürzte in ein Ameisennest ein. Das Hinzufügen einer Typkonvertierung löst das Problem so einfach, aber ich glaube nicht, dass wir es einfach so lassen können.

Verwenden Sie insbesondere PHP, um Finanzberechnungen durchzuführen oder Schnittstellenberechnungen und starkes Andocken von Sprachen zu schreibenDie Studierenden sollten mehr Aufmerksamkeit schenken.

Es ist keine große Sache, Details entscheiden über Erfolg oder Misserfolg. Nach sorgfältigem Studium gibt es tatsächlich viele Möglichkeiten, dies zu tun, und ich habe auch eine Lektion gelernt.

Wussten Sie wirklich, dass PHP eine schwach typisierte Sprache ist?

Vor einiger Zeit habe ich den PHP-Kernel erforscht und ein detailliertes Verständnis der zugrunde liegenden Speicherstruktur von PHP-Variablen erhalten. Allerdings verstand ich den Funktionsweisesprozess verschiedener Arten von Variablen nicht Werte und die Transformation von Variablentypen.

Tatsächlich ist es ein Problem mit unserem intelligenten PHP [automatische Typkonvertierung] Dies ist auch die Stärke von PHP als schwach typisierte Sprache Studieren Sie es einfach vollständig und fassen Sie es zusammen.

(Im Folgenden finden Sie 5 Beispiele. Bei allen handelt es sich um sehr einfache Vorgänge, aber Sie können den Grund möglicherweise nicht nennen)

2. Prozessanalyse

Fall 1

Schauen wir uns zunächst die Probleme an, auf die ich gestoßen bin (vereinfacht). ist für mich der Auslöser, diesen Blog zu schreiben.

  $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)

Hinweis: Es sind zwei Änderungen aufgetreten.
1. Subtrahieren Sie Zeichenfolgen und wandeln Sie sie in Gleitkommatypen um
2. Die Minuenden sind alle zwei Dezimalstellen und das Ergebnis ist keine Dezimalstelle [Hier tritt auch der Fehler auf, da die App dafür zwei Dezimalstellen benötigt display 】
Ebenso ist das Ergebnis beim Subtrahieren von Zeichenfolgen ohne Dezimalzahlen 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)

Schlussfolgerung:
1. Betrieb am unteren Rand von PHP Während Bei diesem Vorgang wird die Typkonvertierung automatisch durchgeführt, Dezimalzahlen werden in Float konvertiert und Ganzzahlen werden in Int konvertiert.
2. Wenn Sie die Anzahl der Dezimalstellen für Zahlen begrenzen müssen, denken Sie daran, sich damit zu befassen. number_format();

hat bereits begonnen, lassen Sie uns über diese Typkonvertierung sprechen.

Beispiel 2
Frage: Ist das Folgende wahr oder falsch?

    var_dump(0123 == 123);  
    var_dump('0123' == 123);  
    var_dump('0123' === 123);

Wie lautet die Antwort? ?
false;true;false
Analyse:
Ich glaube, es ist für jeden leicht zu erraten, dass die dritte falsch ist, weil === ein starkes Urteil ist und einen Typvergleich hinzufügt
Es gibt zwei Dinge, auf die Sie hier achten sollten. Einerseits betrachtet die unterste Ebene von PHP die mit 0 beginnenden Ganzzahlen als Oktalzahlen, andererseits wird bei der Konvertierung von sting in int die führende 0 entfernt
var_dump(0123 == 123); // false, PHP verwendet standardmäßig 0123 und behandelt es als Oktalzahl, aber die tatsächliche Konvertierung in eine Dezimalzahl ist 83. Offensichtlich ist dies nicht gleich.
var_dump('0123' == 123); // true hier wäre es für PHP sehr interessant, '0123' in eine Zahl umzuwandeln und die vorherige 0 zu entfernen, die standardmäßig 123==123 ist
var_dump(' 0123 ' === 123); // false Offensichtlich besagt die obige Frage, dass die Zahlen- und Zeichenfolgentypen inkonsistent sind.
Schlussfolgerung:
1. Ganzzahlige Zahlen, die mit 0 beginnen, werden von PHP als Oktal verarbeitet
2. Schlussfolgerung 1 von Kollege Beispiel 1: Zeichenfolgen führen während des Betriebs automatisch eine Typkonvertierung durch, und die führende 0 wird entfernt


Beispiel 3
Was ist das Ergebnis von $x unten:

      $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内核有关,变量分离改变】

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung der Vorgänge, bei denen PHP-Entwickler fast immer Fehler machen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn