Вопрос по php, zend-framework, coding-style – PHP - обратный порядок в операторе if

8

Это вопрос, который беспокоит меня долгое время и не может найти никакого ответа ... Заметил, что он довольно часто используется разработчиками Zend Framework,

В чем разница между следующими 2 & quot; if & quot; заявления? :

if (null === $this->user) { ... }

if ($this->user === null) { ... }

Для меня первый выглядит немного странно;]

Спасибо за ответ.

Ваш Ответ

7   ответов
13

Это не различие в том, как работает ваш скрипт, это всего лишь стандарт кодирования, рекомендация

Причина, по которой рекомендуется использовать его таким образом:

if (null == $this->user)

тот факт, что если вы наберете неправильно и напишите = вместо ==, вы получите ошибку, а

($this->user = null)

вместо

($this->user == null)

работает, но вызывает странные ошибки (назначение и окончательное значение оценивается как bool вместо сравнения)

и я думаю, что это просто распространено на оператора строгого сравнения (===)

UpdateТак как я вижу, что в этой теме все еще есть активность даже через 3 года после того, как я опубликовал ответ, я решил добавить кое-что, что я забыл упомянуть. Этот тип обозначений известен какyoda conditionsВы можете прочитать больше об этом наэта страница википедии например.

@alchemication Я рад, что это помогает, это был хороший вопрос +1
Спасибо! Очень простой, но не смог найти никаких ответов ... alchemication
@RockyFord да, верно. Я упомянул только общую идею, которая одинакова, независимо от того, является ли константа нулевой, 2, PHP_EOL или любой другой
@ Мишу, я знаю, это не было адресовано тебе. Удивительно, сколько людей не могут использовать доступные функции языка.
также звучит как очень хорошая причина для использованияis_null($var) или же!is_null($var) по возможности и практично. Вынимает угадайку.
4

Это хорошая практика для письмаif заявление. Рассмотрим этот код:

if (10 == $var) {
  echo 'true';
} else {
  echo 'false';
}

Если вы забыли один знак равенства:

if (10 = $var) { }

Тогда PHP сгенерирует ошибку разбора, так что вы знаете, что пропустили= и вы можете это исправить. Но этот код:

if ($var = 10) { }

назначит 10 для$var и всегда оценивает к истинному состоянию. Независимо от содержания$varприведенный выше код всегда будет отображать "true" и это очень трудно найти эту ошибку.

Что ж, имеет смысл, я думаю, что Eclipse использовался для выделения одного & quot; = & quot; В случае, если заявления, как ошибка для меня, но Net Beans не ... так может быть полезным в качестве хорошей практики, спасибо! alchemication
1

Результат будет таким же, однако второе логично. Вы хотите проверить, является ли переменная NULL, а не является ли NULL переменной ... Причина, по которой это делается наоборот, описана здесь: http://umumble.com/blogs/Programming/321/

1

Такой порядок элементов в сравнении, я думаю, предназначен для предотвращения случайного назначения в операторах if.

1

При сравнении значений нет разницы в порядке.

Кому-то может быть легче читать или писать такой код, но для меня это то же самое, что писать справа налево.

1

Если вы случайно напишите:

if (null = $this->user) { ... }   

вы получите синтаксическую ошибку.

Если вы случайно напишите:

if ($this->user = null) { ... }

Вы будете искать причину странного поведения вашего приложения в течение длительного времени.

Хорошо, большое спасибо. Это именно то, что я искал! alchemication
1

Это так называемые условия йоды.

Идея состоит в том, что если вы поставите значение первым (например, false, null, true или что-нибудь короткое), человеку станет легче просматривать утверждение и быстро понимать намерение условия.

Кроме того, что сказал Мишу :)

Похожие вопросы