сравнивая,! == против! = - PullRequest
       56

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

6 голосов
/ 15 июня 2011

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

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

$stuff = 'foo';
if($stuff !== 'foo') // do...

Есть ли причина, по которой они это делают? !== быстрее != или что?

Ответы [ 7 ]

13 голосов
/ 15 июня 2011

Нельзя сказать, что != сравнивает только значение.Поскольку он скорее сравнивает типы, применяет преобразование типов при необходимости (см. таблицу Сравнение с различными типами ), а затем сравнивает (преобразованные) значения.

В отличие от этого, !== завершается ошибкой раньше, если типы не равны и преобразование типов не выполняется.

5 голосов
/ 15 июня 2011

Оператор != является битом медленнее , поскольку при необходимости он включает неявное преобразование,

, в то время как !== сравнивает типы до, а затемзначения (только если типы равны)

Кроме того, следуйте этому ответу для получения дополнительной информации о различиях между двумя операндами

3 голосов
/ 15 июня 2011

Если вы заранее знаете, что обе переменные относятся к одному и тому же типу, это не будет иметь никакого значения. Я думаю, что разница в скорости настолько незначительна, что аргумент скорости можно (и нужно) полностью игнорировать, и вы должны сосредоточиться на своем приложении, а не на преждевременной (и ненужной) оптимизации.

Однако, если у вас есть требование, что аргумент и должен быть точно таким, как вы ожидаете (например, === 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-кратное увеличение скорости и сделают такие «оптимизации» бесполезными. Это учебный случай преждевременной оптимизации.

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

2 голосов
/ 15 июня 2011
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
2 голосов
/ 15 июня 2011

Это на самом деле не быстрее, когда вы знаете, что тип одинаковый, как в вашем примере. Основная причина, по которой люди используют !==, заключается в том, что он удерживает PHP от магии жонглирования типов , поэтому вероятность сравнения невелика, что-то, чего вы не хотели.

2 голосов
/ 15 июня 2011

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

Так что если у вас есть

$i = "0";

$i == 0 вернет true, а $i === 0 вернет false.

, если у вас есть

$j = 0;

$j == null, вернет true, а $j === null вернет false.

1 голос
/ 15 июня 2011

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

...