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

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

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

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

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

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

Однако, если у вас есть требование, что и аргумент должен быть именно тем, что вы ожидаете (например, === false если вы не хотите, чтобы 0 прошел тест равенства), используйте === or !== .

Как упоминалось в Headshota, если вы работаете с объектами, тогда === проверяет, что две переменные фактически указывают на один и тот же экземпляр объекта , тогда как == пытается сопоставить их по значению, что может привести к неожиданным результатам и должно использоваться с большое внимание. Здесь будет использоваться строгий оператор, потому что это означает что-то для приложения.

Чтобы ответить на ваш вопрос, если в вашем конкретном контексте некоторые люди используют === or !== где вы знаете, что обе переменные имеют один и тот же (скалярный) тип, то я предполагаю, что это всего лишь вопрос стиля кодирования и показывает немного строгости в коде, обеспечивающей идею о том, что обе переменные одного типа, возможно, не с учетом производительности.

Строгие операторы должны использоваться, когда это означает что-то для этого , а не как оптимизация производительности.

Обновление : чтобы ответить на аргумент скорости, давайте рассмотрим этот небольшой тест:

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

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

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

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

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

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

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

 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 

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

Поэтому, если у вас есть

 $i = "0"; 

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

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

 $j = 0; 

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

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

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