Разница между переменной === значением и переменной === значением?

#php #zend-framework #equality

#php #zend-framework #равенство

Вопрос:

а)

   if(null === $object)
    {
    //take some action
    }
  

б)

   if($object === null)
    {
    //take some action
    }
  

Я привык делать как b), но в Zend-Framework я везде нахожу, что они сделали это как a) . Есть ли какие-либо преимущества от этого??

Спасибо.

Ответ №1:

Нет, разницы нет.

Предполагается, что последнее поможет избежать глупых опечаток, когда вы пишете $a = null вместо $a == null (или $a === null ) . В первом случае вы получите логическую ошибку из-за присваивания вместо сравнения, во втором случае — вы получите фатальную ошибку, которая поможет вам быстрее найти проблему.

Комментарии:

1. В javascript вы сталкиваетесь с проблемами с приведением типов. Разве PHP этого не делает?

Ответ №2:

Разницы нет, она используется для избежания ошибок (например, для установки переменной null , а не для их сравнения), однако null === $object часто считается плохим способом (c) избежать опечаток.

Ответ №3:

$object === null Выражение намного более удобно для человека null === $object , чем потому, что второе нарушает порядок чтения природы, который слева направо. Вот почему, даже если для интерпретатора нет большой разницы, но человеку немного сложнее читать. С использованием некоторой логики — если вы используете оператор if ..else, как это должно звучать? «Если null равно $object .. Подождите минутку null , null разве это может быть равно чему-то другому? О, боже, мы на самом деле сравниваем правостороннее значение с левосторонним, все наоборот. Итак, если $object равно null , то мы должны ..». И вы думаете так каждый раз.

Мой вывод: используйте $value == const каждый раз, когда сможете! Давным-давно люди писали if ($value = const) , но эти времена прошли. Теперь каждая среда разработки может рассказать вам о таких простых ошибках.

Комментарии:

1. Порядок чтения природы будет работать в обоих направлениях. Кроме того, рекомендуется писать NULL слева направо и для чтения слева направо, чтобы предотвратить опечатки (что мы делаем как люди). Так что более естественно проявлять осторожность, не так ли? Буквально -1

2. Как по мне, это гораздо легче читать if $apple is RED , чем тогда if RED is $apple . Я согласен, в этом случае мы могли бы сделать опечатки, но я думаю, что основная цель — бороться со сложностью кода и сделать его простым для понимания. Я предпочитаю делать свой код более читабельным и иметь некоторый риск ввода = , а == не потому, что это происходит очень редко, и его довольно легко найти, если следовать одному из правил чистого кода — писать наименьшие возможные функции.

3. Ну, гораздо лучше читать: if ($apple->isRed()) . Не смешивайте глаголы с существительными, а делайте существительные объектами, а глаголы — методами. Мой аргумент был скорее такого рода: if (a === b) или if (b === a) одинаково читать. Это сравнение (двустороннее), поэтому естественное чтение не должно иметь значения.

4. Да, вы совершенно правы, когда when a и b являются переменными. (В моем последнем комментарии мне пришлось назвать переменную $apple_color , простите). Но когда есть переменная и константа, такие как $apple_color и RED , это легче понять if ($apple_color == RED) , чем тогда if (RED == $apple_color) . По природе сравнения мы сравниваем то, что находится в фокусе внимания, с чем-то другим. И если comparsion принимает значение false, мы должны взять материал и сравнить его с другим чем-то. В случае RED == $apple_color , если мы непреднамеренно принимаем RED за материал и сравниваем с чем-то другим

Ответ №4:

б) намного более читабелен, чем а)

И a) рассматривается некоторыми перестраховочными людьми как менее подверженный ошибкам из-за возможного путаницы == с = .
Но в случае трех = я сомневаюсь, что кто-нибудь перепутает его с одним.

Комментарии:

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

Ответ №5:

Это выбор разработчика, чтобы попытаться остановить случайное присвоение значений.

Функциональность между двумя методами сравнения точно такая же, но в случае «a» это останавливает любое случайное присвоение значений, поскольку вы не можете присвоить что-либо нулевому.

Ответ №6:

Второй метод проверяет значение и тип переменной null , ошибки должны быть разными в разных методах.

Комментарии:

1. Они оба проверяют значение и тип, поскольку оба используют === оператор. Единственное отличие заключается в том, что первая позволяет избежать опечаток, которые привели бы к присваиванию вместо сравнения.