Сравнение,! == versus! =

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

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

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

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

Ответ 1

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

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

Это означает, что одно строгое сравнение ускорит ваш script на 0.00000002 seconds.

Если вы думаете, что это то, что вы должны учитывать при написании своего script, тогда сделайте это. Но вы скоро столкнетесь с другими крошечными оптимизациями, которые дадут вам 1000-кратное увеличение скорости и сделают такие "оптимизации" бесполезными. Это случай учебника преждевременной оптимизации.

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

Ответ 2

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

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

Ответ 3

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

while !== сравнивает типы before и then values ​​(только если типы равны)

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

Ответ 4

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

Итак, если у вас

$i = "0";

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

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

$j = 0;

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

Ответ 5

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

Ответ 6

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

Ответ 7

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