#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
слева направо и для чтения слева направо, чтобы предотвратить опечатки (что мы делаем как люди). Так что более естественно проявлять осторожность, не так ли? Буквально -12. Как по мне, это гораздо легче читать
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. Они оба проверяют значение и тип, поскольку оба используют
===
оператор. Единственное отличие заключается в том, что первая позволяет избежать опечаток, которые привели бы к присваиванию вместо сравнения.