it-swarm-eu.dev

if ('konstanta' == $ proměnná) vs. if ($ proměnná == 'konstanta')

V poslední době jsem hodně pracoval v PHP a konkrétně v rámci WordPress framework). Všiml jsem si hodně kódu v podobě:

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

Kde bych očekával:

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

Je tato úmluva nalezena v určitých jazycích/rámcích? Existuje nějaký důvod, proč je dřívější přístup výhodnější než druhý (z pohledu zpracování nebo z pohledu analýzy nebo dokonce z pohledu člověka?)

Nebo je to jen otázka vkusu? Vždy jsem si myslel, že při provádění testu je lepší, aby proměnná položka testovaná proti nějaké konstantě byla nalevo. Zdá se, že lépe mapuje způsob, jakým bychom se ptali v přirozeném jazyce: „pokud je dort čokoládový“, spíše než „pokud je dort čokoládový“.

50
Tom Auger

Hlavním důvodem k tomu (tzv. „Podmíněný Yoda“) je zabránit nehodám, při nichž omylem použijete operátora přiřazení (=) místo operátora stejného srovnání (==).

To znamená, že pokud jste udělali chybu, že jste to udělali:

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

Prohlášení bude vyhodnoceno jako true (nebo v případě některých jazyků - jako PHP - truthy value) a budete mít těžko nalezitelnou chybu.

Ale pokud ano:

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

Obdržíte závažnou chybu, protože nemůžete přiřadit $foo na celé číslo.

Jak jste však zdůraznili, obrácení pořadí obecně věci méně čte. Mnoho kódovacích standardů (ale ne všechny, včetně WordPress ) tedy navrhuje nebo vyžaduje $foo == 1 přes výhody lovu chyb 1 == $foo.

Obecně je mou radou postupovat podle zavedeného standardu kódování, pokud existuje: pro WordPress to znamená použití podmínek Yoda.

Pokud není, a není možné jej založit na základě konsensu s vašimi kolegy, je to volba prodejce.

84
user8

Je to obranný mechanismus kódování, který má zabránit náhodnému použití operátora přiřazení.

Zvažte zneužití/chybu operátora přiřazení místo operátora rovnosti

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

Výše uvedená podmínka by se vždy vrátila pravdivá, ale pravděpodobně to není to, co měl na mysli původní programátor. Zvažte, na svém místě, toto

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

Zde by se PHP (a většina dalších jazyků) odmítlo spustit, protože je nemožné přiřadit cokoli pevné hodnotě 1. Tímto kódováním všech podmíněných příkazů automaticky zajistíte, že operátor přiřazení v podmíněném použití nebude náhodně použit.

13
Alan Storm

Rád používám tuto konvenci v Java k odstranění možnosti nulové výjimky ukazatele. Takže něco takového vám nezpůsobí žádné problémy ani nepotřebuje žádný další kód:

String foo = null;

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

V praxi vám mnoho kompilátorů dá varování, pokud napíšete „if (x = 1)“ namísto „if (x == 1)“, protože je to pravděpodobně chyba.

S Clangem se můžete vyhnout varování varováním kompilátoru „Myslím to vážně a vím, co dělám“, a to se provádí psáním „if ((x = 1))“. Poznamenejte si další závorky. To funguje i v jiných situacích. if (false) prohlášení; může vám dát varování, že prohlášení není nikdy provedeno; if ((false)) prohlášení; nedává to varování.

0
gnasher729