Сравнение строк с использованием == против strcmp - PullRequest
315 голосов
/ 26 июля 2010

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

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

Ответы [ 12 ]

312 голосов
/ 26 июля 2010

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

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

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

211 голосов
/ 13 декабря 2011

Никогда не следует использовать == для сравнения строк. === в порядке.

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

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

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

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

96 голосов
/ 21 июня 2012

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

Например, '1e3' == '1000' возвращает trueВы должны использовать === вместо.

43 голосов
/ 03 февраля 2013

Ну, в соответствии с этим отчетом об ошибках php , вы даже можете получить 0wned.

<?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.

32 голосов
/ 23 февраля 2013

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

20 голосов
/ 31 августа 2017

Подведение итогов всех ответов:

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

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

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

20 голосов
/ 26 сентября 2011

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

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

Примеры:

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

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

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

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

10 голосов
/ 28 ноября 2014

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

пример кода: http://snipplr.com/view/758/

6 голосов
/ 06 июня 2012

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

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

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

4 голосов
/ 26 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...