Сравнивая,!== против! =
Я знаю это !==
используется также для сравнения типов переменных, в то время как !=
только сравнивает значения.
Но я вижу, что многие люди используют !==
когда они сравнивают значения, например:
$stuff = 'foo';
if($stuff !== 'foo') // do...
Есть ли причина, по которой они это делают? Является !==
быстрее, чем !=
или что?
7 ответов
Если вы заранее знаете, что обе переменные относятся к одному и тому же типу, это не будет иметь никакого значения. Я думаю, что разница в скорости настолько незначительна, что аргумент скорости можно (и нужно) полностью игнорировать, и вы должны сосредоточиться на своем приложении, а не на преждевременной (и ненужной) оптимизации.
Тем не менее, если у вас есть требование, что аргумент и должен быть именно то, что вы ожидаете (например, === false
когда ты не хочешь 0
пройти тест на равенство), затем используйте ===
или же !==
,
Как уже упоминалось в Headshota, если вы работаете с объектами, то ===
проверяет, что две переменные фактически указывают на один и тот же экземпляр объекта, тогда как ==
пытается сопоставить их по значению, что может привести к неожиданным результатам и должно использоваться с большой осторожностью. Здесь будет использоваться строгий оператор, потому что он что-то значит для приложения.
Чтобы ответить на ваш вопрос, если в вашем конкретном контексте некоторые люди используют ===
или же !==
если вы знаете, что обе переменные имеют один и тот же (скалярный) тип, то я полагаю, что это просто вопрос стиля кодирования, и он демонстрирует некоторую строгость в коде, что подтверждает идею о том, что обе переменные одного типа, вероятно не с учетом производительности.
Строгие операторы должны использоваться, когда это что-то значит, а не для оптимизации производительности.
Обновление: чтобы ответить на аргумент скорости, давайте рассмотрим небольшой тест:
$a = "test";
$b = "test";
$t = microtime(true);
for ($i=0; $i<1e6; $i++) {
($a == $b);
// (100x the equality test, omitted for clarity purposes,
// to lower the speed impact of the loop itself)
($a == $b);
}
printf('%.3f', microtime(true)-$t);
Я примерно получаю
6.6 seconds for ==
4.3 seconds for ===
Теперь, если я использую $b = 1;
чтобы заставить неявное преобразование, я получаю примерно:
4.4 seconds for ==
2.4 seconds for ===
Это означает примерно 2-секундное усиление в обоих случаях. Вы можете подумать, и в какой-то мере вы будете правы, что это демонстрация скоростного преимущества оператора строгого сравнения. Но не забывайте, что мы говорим о 1e6 * 100
= 100 миллионов итераций.
Это означает, что одно строгое сравнение ускорит ваш сценарий 0.00000002 seconds
,
Если вы думаете, что это то, что вы должны учитывать при написании сценария, сделайте это. Но вскоре вы столкнетесь с другими крошечными оптимизациями, которые дадут вам 1000-кратное увеличение скорости и сделают такие "оптимизации" бесполезными. Это учебный случай преждевременной оптимизации.
Опять же, используйте операторы строгого сравнения, если это необходимо, потому что это требование в вашем коде. Не используйте его по соображениям производительности.
Неверно говорить, что !=
сравнивает только значение. Поскольку он скорее сравнивает типы, при необходимости применяет преобразование типов (см. Таблицу сравнения с различными типами), а затем сравнивает (преобразованные) значения.
В отличие от этого, !==
не удается раньше, если типы не равны и преобразование типов не выполняется.
!=
оператор немного медленнее, потому что он включает в себя неявное преобразование при необходимости,
в то время как !==
сравнивает типы до и затем значения (только если типы равны)
Кроме того, следуйте этому ответу для получения дополнительной информации о различиях между двумя операндами
На самом деле,!== не используется для сравнения типов переменных, он используется для проверки того, что сравниваемые значения имеют одинаковый тип и одинаковое значение.
Так что если у вас есть
$i = "0";
$i == 0
вернет истину, в то время как $i === 0
вернет ложь.
если у вас есть
$j = 0;
$j == null
вернет истину, в то время как $j === null
вернет ложь.
Это не очень быстро, когда вы знаете, что тип один и тот же, как в вашем примере. Основная причина, по которой люди используют !==
заключается в том, что он не дает PHP использовать магию жонглирования, так что меньше шансов на сравнение, что-то, чего вы не хотели.
For example
$flag = 0;
if($flag == false ){
echo "true";
}else{
echo "false";
} // echo true;
$flag = 0;
if($flag === false ){
echo "true";
}else{
echo "false";
} // echo false;
$flag = false;
if($flag === false ){
echo "true";
}else{
echo "false";
} // echo true
Как правило, проверять идентичность безопаснее, чем равенство, это позволяет избежать многих ошибок, вызванных недопустимыми типами. но есть случаи, когда идентичность не обязательна, поэтому вы можете использовать равенство в этом случае.