it-swarm-eu.dev

if ('Konstante' == $ Variable) vs. if ($ Variable == 'Konstante')

In letzter Zeit habe ich viel in PHP und speziell im WordPress Framework) gearbeitet. Ich bemerke viel Code in Form von:

if ( 1 == $options['postlink'] )

Wo ich erwartet hätte zu sehen:

if ( $options['postlink'] == 1 )

Ist dies eine Konvention, die in bestimmten Sprachen/Frameworks zu finden ist? Gibt es einen Grund, warum der erstere Ansatz dem letzteren vorzuziehen ist (aus einer Verarbeitungsperspektive oder einer Parsing-Perspektive oder sogar einer menschlichen Perspektive?)?

Oder ist es nur Geschmackssache? Ich habe es mir immer besser gedacht, wenn ich einen Test durchführe, dass sich das zu testende variable Element links befindet. Es scheint besser auf die Art und Weise abzubilden, wie wir die Frage in natürlicher Sprache stellen würden: "Wenn der Kuchen Schokolade ist" anstatt "Wenn Schokolade der Kuchen ist".

50
Tom Auger

Der Hauptgrund dafür (sogenannte "Yoda-Bedingung") besteht darin, Unfälle zu vermeiden, bei denen Sie versehentlich einen Zuweisungsoperator (=) anstelle des gleichen Vergleichsoperators (==) verwenden. .

Das heißt, wenn Sie den Fehler gemacht haben:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

Die Anweisung wird zu true ausgewertet (oder bei einigen Sprachen - wie PHP - zu einem wahrheitsgemäßen Wert), und Sie haben einen schwer zu findenden Fehler.

Aber wenn du es getan hast:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

Sie erhalten einen schwerwiegenden Fehler, weil Sie einer Ganzzahl $foo nicht zuweisen können.

Wie Sie bereits betont haben, ist die Lesbarkeit durch Umkehren der Reihenfolge im Allgemeinen weniger lesbar. Daher schlagen viele Codierungsstandards (aber nicht alle, einschließlich WordPress ) $foo == 1 vor oder erfordern _ trotz der Vorteile von 1 == $foo für die Fehlersuche.

Im Allgemeinen rate ich, den etablierten Codierungsstandard zu befolgen, falls es einen gibt: Für WordPress bedeutet dies die Verwendung von Yoda-Bedingungen.

Wenn dies nicht der Fall ist und es unmöglich ist, einen Konsens im Konsens mit Ihren Kollegen zu erzielen, hat der Händler die Wahl.

84
user8

Es handelt sich um einen defensiven Codierungsmechanismus, der eine versehentliche Verwendung des Zuweisungsoperators verhindern soll.

Betrachten Sie einen Missbrauch/Fehler des Zuweisungsoperators anstelle des Gleichheitsoperators

if ( $options['postlink'] = 1  )

Die obige Bedingung würde immer true zurückgeben, aber das hatte der ursprüngliche Programmierer wahrscheinlich nicht im Sinn. Betrachten Sie an seiner Stelle dies

if( 1 = $options['postlink'])

Hier würde PHP (und die meisten anderen Sprachen) die Ausführung verweigern, da es unmöglich ist, dem festen Wert von 1irgendetwas zuzuweisen. Durch Codierung Wenn Sie alle bedingten Anweisungen auf diese Weise ausführen, stellen Sie automatisch sicher, dass ein Zuweisungsoperator nicht versehentlich in einer Bedingung verwendet wird.

13
Alan Storm

Ich verwende diese Konvention gerne in Java, um die Möglichkeit einer Nullzeigerausnahme zu entfernen. So etwas verursacht also keine Probleme oder benötigt zusätzlichen Code:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}
9
Ben Newman

In der Praxis geben viele Compiler eine Warnung aus, wenn Sie "if (x = 1)" anstelle von "if (x == 1)" schreiben, da dies höchstwahrscheinlich ein Fehler ist.

Mit Clang können Sie die Warnung vermeiden, indem Sie dem Compiler effektiv sagen "Ich meine es ernst und ich weiß, was ich tue". Dazu schreiben Sie "if ((x = 1))". Beachten Sie die zusätzlichen Klammern. Das funktioniert auch in anderen Situationen. if (falsche) Aussage; kann Ihnen eine Warnung geben, dass die Anweisung niemals ausgeführt wird; if ((false)) Anweisung; gibt diese Warnung nicht.

0
gnasher729