Это вопрос, который прослушивает меня в течение долгого времени и не может найти ответа … Заметил, что он очень много используется разработчиками Zend Framework,
В чем разница между следующими заявлениями «если»? :
if (null === $this->user) { ... } if ($this->user === null) { ... }
Для меня первый выглядит странно;]
Спасибо за ответ.
Это не разница в том, как работает ваш скрипт, это всего лишь стандарт кодирования, рекомендация
Причина, по которой рекомендуется использовать его таким образом:
if (null == $this->user)
это тот факт, что если вы ошиблись и напишите = вместо ==, вы получите сообщение об ошибке, в то время как
($this->user = null)
вместо
($this->user == null)
работает, но вызывает странные ошибки (назначение и конечное значение оценивается как bool вместо сравнения)
и я предполагаю, что он просто расширен как привычка к строгому оператору сравнения (===)
Обновление : поскольку я вижу, что в этом потоке еще есть активность, даже через 3 года после того, как я опубликовал ответ, я решил, что добавлю кое-что, о чем я забыл упомянуть. Этот тип обозначений известен как yoda conditions
, вы можете прочитать больше об этом на этой странице в Википедии, например.
Это хорошая практика для написания заявления. Рассмотрим этот код:
if (10 == $var) { echo 'true'; } else { echo 'false'; }
Если вы забыли один знак равенства:
if (10 = $var) { }
Затем PHP будет генерировать ошибку синтаксического анализа, поэтому вы знаете, что пропустили один =
и можете исправить ошибку. Но этот код:
if ($var = 10) { }
будет присваивать от 10 до $var
и всегда оценивает истинное состояние. Независимо от содержимого $var
, код выше всегда будет отображаться «true», и его очень сложно найти эту ошибку.
При сравнении значений нет никакой разницы.
Это может быть проще для кого-то читать или писать такой код, но для меня это то же самое, что писать справа налево.
Такой порядок элементов в сравнении, я думаю, предназначен для предотвращения случайного присваивания в операторах if.
Результат будет таким же, однако второй логичен. Вы хотите проверить, является ли переменная NULL, а не если NULL является переменной … Причина для этого в другом виде описана здесь: http://umumble.com/blogs/Programming/321/
Они называются условиями йоды.
Идея состоит в том, что если вы сначала поместите значение (например, false, null, true или что-то короткое), человеку становится легче сканировать отчет и быстро понять намерение этого условия.
Кроме того, что сказал мишу 🙂
Если вы случайно напишете:
if (null = $this->user) { ... }
вы получите синтаксическую ошибку.
Если вы случайно напишете:
if ($this->user = null) { ... }
вы будете искать причину странного поведения вашего приложения в течение длительного времени.