Сравнивая,!== против! =

Я знаю это !== используется также для сравнения типов переменных, в то время как != только сравнивает значения.

Но я вижу, что многие люди используют !== когда они сравнивают значения, например:

$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

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

Другие вопросы по тегам