Сравнение строк с помощью == vs. strcmp

Похоже, что PHP-оператор if чувствителен к регистру? Так есть ли причина использовать strcmp() ? Безопасно ли что-то вроде:

 if ( $password == $password2 ) { ... } 

Причина его использования заключается в том, что strcmp

возвращает <0, если str1 меньше str2; > 0, если str1 больше str2 и 0, если они равны.

== только возвращает true или false , это не говорит вам, что является «большой» строкой.

Вы не должны использовать == для сравнения строк. === в порядке.

 $something = 0; echo ('password123' == $something) ? 'true' : 'false'; 

Просто запустите приведенный выше код, и вы поймете, почему.

 $something = 0; echo ('password123' === $something) ? 'true' : 'false'; 

Теперь это немного лучше.

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

Например, '1e3' == '1000' возвращает true.

Ну … в соответствии с этим сообщением об ошибке php вы можете даже получить Owned.

 <?php $pass = isset($_GET['pass']) ? $_GET['pass'] : ''; // Query /?pass[]= will authorize user //strcmp and strcasecmp both are prone to this hack if ( strcasecmp( $pass, '123456' ) == 0 ){ echo 'You successfully logged in.'; } ?> 

Это дает вам предупреждение, но все же обходит сравнение.
Вы должны делать === как предлагал @postfuturist.

Всегда помните, что при сравнении строк вы должны использовать оператор === operator (строгое сравнение) и не == (потерять сравнение).

Использование == может быть опасным.

Обратите внимание, что он переместит переменную в другой тип данных, если они отличаются друг от друга.

Примеры:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

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

Использование === , однако, рекомендуется, так как тест показывает, что он немного быстрее, чем strcmp() и его альтернативна strcasecmp() регистра.

Быстрый googling кричит это сравнение скорости: http://snipplr.com/view/758/

strcmp () и «===» чувствительны к регистру, но «===» выполняется намного быстрее

образец кода: http://snipplr.com/view/758/

strcmp вернет различные значения в зависимости от среды, в которой он работает (Linux / Windows)!

Причина в том, что у него есть ошибка, так как в отчете об ошибке говорится: https://bugs.php.net/bug.php?id=53999

Пожалуйста, обращайтесь с осторожностью! Спасибо.

Подводя итог всем ответам:

  • ==плохая идея для сравнения строк.
    Во многих случаях это даст вам «неожиданные» результаты. Не верьте этому.

  • === хорошо, и даст вам лучшую производительность.

  • strcmp() следует использовать, если вам нужно определить, какая строка «больше», как правило, для операций сортировки.

Также функция может помочь в сортировке. Для более четкого определения сортировки. strcmp () возвращает меньше 0, если string1 сортирует перед string2, больше 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например

 $first_string = "aabo"; $second_string = "aaao"; echo $n = strcmp($first_string,$second_string); 

Функция вернет больше нуля, поскольку aaao сортирует перед aabo.

Вы можете использовать strcmp() если хотите заказать / сравнить строки лексикографически . Если вы просто хотите проверить равенство, тогда == просто отлично.

Сравнение строк с использованием strcmp

 echo strcmp("my name","my name");