Heim  >  Artikel  >  Backend-Entwicklung  >  Über ein Problem, auf das der bedingte PHP-Operator stößt, und seine Lösung

Über ein Problem, auf das der bedingte PHP-Operator stößt, und seine Lösung

不言
不言Original
2018-07-14 13:54:211509Durchsuche

Dieser Artikel stellt hauptsächlich ein Problem und eine Lösung vor, die bei PHP-Bedingungsoperatoren auftreten. Es hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.

Ich bin darauf gestoßen Frage zur verschachtelten Verwendung von bedingten Operatoren (ternäre Ausdrücke) in PHP

Phänomen

Sehen wir uns zunächst einen Teil des C-Sprachcodes an (test.c ):

#include<stdio.h>
int main() {
  int x = 1;
  int shit = x == 1 ? 100 : 
     x == 2 ? 200 : 300;
  printf("shit的值:%d\n", shit);
  return 0;
}</stdio.h>

Kompilieren und ausführen

root$ gcc test.c -o test && ./test
shit的值:100

Die Antwort ist wie erwartet, denn x==1, also wird 100 Scheiße zugewiesen.

Aber wenn wir den obigen Code in PHP umschreiben (test.php):

<?php $x = 1;
$shit = $x == 1 ? 100 : 
   $x == 2 ? 200 : 300;
echo "shit的值:$shit\n";

Führen Sie ihn aus:

root$ php test.php
shit的值:200

Wir stellen fest, dass die Ergebnisse zurückgegeben werden sind unterschiedlich, warum ist das so?

Fehlerbehebung

Zuerst vermute ich, dass es sich möglicherweise um ein vorrangiges Problem mit dem Vergleichsoperator(==) und dem Bedingungsoperator handelt (?:) in PHP, schauen wir uns die offizielle PHP-Dokumentation an.

== hat eine höhere Priorität als ?: (C-Sprache Dies ist auch der Fall), daher ist

$shit = $x == 1 ? 100 : 
   $x == 2 ? 200 : 300;

äquivalent zu

$shit = ($x == 1) ? 100 : 
   ($x == 2) ? 200 : 300;

und ist tatsächlich wahr, wenn es einmal ausgeführt wird. Dies kann die Möglichkeit ausschließen, dass der Operatorvorrang das verursacht Problem.

Aber im offiziellen Dokument gibt es diesen Satz am Beispiel der Operatorkombinationsrichtung:

Über ein Problem, auf das der bedingte PHP-Operator stößt, und seine LösungDies ist dem oben beschriebenen Phänomen sehr ähnlich. Das Problem sollte hier liegen. Nach einigen Recherchen kam ich zu folgendem Schluss:

Schlussfolgerung

  • Die Kombinationsrichtung des Bedingungsoperators (?:) in der Sprache C ist von rechts nach links, jede Auswertung beginnt mit dem Unterausdruck ganz rechts, also

int x = 1;

int shit = x == 1 ? 100 : 
     x == 2 ? 200 : 300;
//等效于
int shit = x == 1 ? 100 : 
     (x == 2 ? 200 : 300);
//等效于
int shit = x == 1 ? 100 : 
     (300);// 100
  • Kombination der PHP-Bedingungsoperatoren (?:) Die Richtung ist von links nach rechts , und jede Auswertung beginnt mit dem Unterausdruck ganz links, sodass

$x = 1;
$shit = $x == 1 ? 100 : 
   $x == 2 ? 200 : 300;
//等效于
$shit = ($x == 1 ? 100 : 
   $x == 2) ? 200 : 300;
//等效于
$shit = (100) ? 200 : 300;// 200

zwischen der PHP-Kombinationsrichtung des bedingten Operators liegt. Wir können den Effekt von if-elseif nicht erzielen. elseif-else-Ausdruck durch Verschachtelung von bedingten Operatoren wie C/C++, es sei denn, wir fügen den späteren Unterausdrücken Klammern hinzu, in diesem Fall kann es auf diese Weise gelöst werden:

$shit = $x == 1 ? 100 : 
   ($x == 2 ? 200 : 300);
Allerdings, wenn es viele bedingte Verzweigungen gibt Es treten Probleme mit der Lesbarkeit des Codes (gestapelte Klammern) auf:

$shit = $x == 1 ? 100 :
     ($x == 2 ? 200 :
     ($x== 3 ? 300 :
     ...
     ($x == 8 ? 800 : 900)))))));
Da PHPs Schreibmethode, Klammern nicht zu stapeln, hinsichtlich der Ausführungsergebnisse nicht mit C/C++ übereinstimmt und die Standardkombinationsrichtung nur durch Hinzufügen geändert werden kann Klammern, um die erwarteten Ergebnisse zu erzielen, daher empfiehlt das PHP-Dokument einfach nicht die Verwendung von verschachtelten bedingten Operatoren:

Hinweis:
Es wird empfohlen, das Verhalten von ternären Ausdrücken von PHP zu vermeiden wenn die Verwendung von mehr als einem ternären Operator innerhalb einer einzelnen Anweisung nicht offensichtlich ist

Das ist es. Der gesamte Inhalt dieses Artikels soll für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie im PHP-Chinesisch Webseite!

Verwandte Empfehlungen:

Lassen Sie uns über Abhängigkeitsinjektion, Container und Erscheinungsmuster in der Framework-Entwicklung sprechen (Teil 2)

So lösen Sie das große Problem von PHP-Problemen mit Parallelität und großem Datenverkehr

Das obige ist der detaillierte Inhalt vonÜber ein Problem, auf das der bedingte PHP-Operator stößt, und seine Lösung. 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