Почему некоторые люди помещают значение перед переменной в оператор if?

Например, что отличаетс от переменной $=== true?

<?php

if (true === $variable) {
     //
}

if (1 === intval($variable)) {
    //
}

Ответ 1

Они эквивалентны.

Некоторые программисты предпочитают этот стиль "Йода", чтобы избежать риска случайного написания:

if ($variable = true) {
    // ...
}

что эквивалентно

$variable = true;
// ...

когда они хотели написать

if ($variable === true) {
    // ...
}

(тогда как if (true = $variable) генерирует очевидную ошибку, а не потенциально-тонкую ошибку).

Ответ 2

Короткий ответ

Некоторые люди делают это, чтобы избежать ошибочного использования оператора присваивания (=), когда они действительно хотели использовать оператор сравнения (== или ===).

Длинный ответ

В PHP есть три оператора, которые могут быть приняты за друг друга:

  • = - оператор присваивания
  • == является оператором "equal to"
  • === - оператор "идентичен"

Первый оператор используется только для назначения значения переменной. Второй и третий используются только для сравнения двух значений или выражений против eachother.

В PHP можно присвоить значение переменной внутри структур управления (if, for, while и т.д.). Это может вызвать проблемы, если вы не будете осторожны. Например, если вы хотите сравнить $a с логическим значением, вы можете сделать это следующим образом:

if ($a == false) // or
if ($a === false)

Если вы не будете осторожны, это может закончиться следующим образом:

if ($a = false)

... это совершенно легальный код, но это назначение и в конечном итоге вызовет проблемы. Причина, по которой это вызовет проблемы, состоит в том, что выражение $a=false будет оцениваться, и код будет работать, как будто ничего не случилось, когда на самом деле он не был предназначен.

Причина, по которой некоторые люди переключаются вокруг операндов при сравнении значения с литералом (фиксированное значение, например true, false, 7, 5.2 и т.д.), связано с тем, что оно не возможно присвоить значение литералу. Например:

if (false = $a)

... вызовет ошибку, сообщив программисту, что они допустили ошибку, которую они затем могут исправить.

Ответ 3

Думаю, это всего лишь способ мышления в целом. Когда вы действительно думаете о глубоком выражении if, вы думаете, что это утверждение истинно, а не другая точка зрения. Это не так, но в моей голове, назвав его обратным, меня раздражало бы и заставляло бы меня терять концентрацию в этом заявлении. Поэтому я бы сказал так, как думают люди: D.

Ответ 4

Нет разницы между ($var === true) и (true === $var). Они эквивалентны.

См. http://php.net/manual/en/types.comparisons.php для полной таблицы сравнений. Вы увидите, что все эквивалентные сравнения имеют одинаковый результат.

Ответ 5

Также некоторые люди предпочитают видеть, какой результат был оценен до утверждения. Некоторые утверждения могут быть длиннее и сложнее для чтения.

Пример:

if (false == (new DataParser()->makeAComplexDataParser((new SomeTransformer()->doTransformation((new someClass()->getMethodOfLongParameters($param1, $param2, (new Date()->format('Y-m-d'))))))))  ) {
    // do stuff
}

Так что лучше подумать "это ложное это сложное выражение?" вместо того, чтобы думать "это сложное выражение… ааааа… ложь?"