2009-08-15 3 views
0

Я знаю, что, например, с помощью:Следует ли использовать строгое сравнение в строках?

if (in_array('...'), array('.', '..', '...') === true) 

За:

if (in_array('...'), array('.', '..', '...') == true) 

Можно повысить производительность и избежать некоторых распространенных ошибок (например, 1 == TRUE), но мне интересно, если есть причина использовать строгие сравнения на строках, такие как:

if ('...' === '...') 

Кажется, чтобы сделать точно то же самое, как:

if ('...' == '...') 

Если кто-то может принести свет на эту тему, я ценю это.

ответ

6

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

Однако в некоторых случаях вы точно не знаете, что значение будет строкой - например, с такими переменными, как переменные $ _GET и $ _POST. Рассмотрим следующий пример:

$_GET['foo'] == "" 

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

$_GET['foo'] === "" 

будет оценивать только истинно, если пустая строка была явно передается в - в противном случае значение $_GET['foo'] может быть эквивалентно пустой строке, но тип не будет, так как это будет на самом деле быть пустым значение для этого индекса, а не строка.

+1

В вашем примере, если никакое значение вообще не было передано в 'foo', вы получите ошибку уровня PHP E_NOTICE. –

+0

Понял, спасибо. –

3

Когда вы можете использовать один или другой выбрать строгое сравнение, потому что:

  1. Он имеет лучшую производительность
  2. Это предотвращает неожиданные результаты

При сравнении строк вы можете иметь неожиданные результаты потому что строка может быть пустой или переменная, которую вы считаете строкой, на самом деле не является.

Вы бы никогда не использовали сравнение двух строковых литералов, потому что оно всегда может быть уменьшено до ИСТИНА или ЛОЖЬ. Например:

if ('...' === '...') 

такая же, как

if (TRUE) 

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

Вы можете увидеть результаты тестов по строгим и свободным сравнениям на http://net-beta.net/ubench/. Я также провел собственные тесты и нашел те же результаты.

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

+0

Спасибо. Кстати, эти тесты http://net-beta.net/ubench/index.php?t=array10 не кажутся эквивалентными. Вы запустили этот сайт? –

+0

Сайт является ссылкой. Я не запускаю его. [net-beta.net/ubench/](http://net-beta.net/ubench/) - это набор различных тестов. Если вы прокрутите страницу до равного 1 - equal7, вы найдете сравнительные тесты. К сожалению, на всей странице нет идентификаторов или названных якорей, поэтому я не могу напрямую ссылаться на группу тестов. –

Смежные вопросы