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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Примеры:

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

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

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

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

Обращайтесь с осторожностью! Спасибо.

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

PHP Вместо использования алфавитной сортировки, используйте значение ASCII символа для сравнения. Строчные буквы имеют более высокое значение ASCII, чем заглавные. Лучше использовать оператор идентичности === для такого сравнения. strcmp() - это функция для сравнения безопасных двоичных строк. Он принимает две строки в качестве аргументов и возвращает <0, если str1 меньше, чем str2; > 0, если str1 больше, чем str2, и 0, если они равны. Существует также версия без учета регистра с именем strcasecmp(), которая сначала преобразует строки в строчные, а затем сравнивает их.

Ответ 13

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

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