it-swarm.com.ru

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

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

if ( $password === $password2 ) { ... }
308
Jiew Meng

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

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

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

306
deceze

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

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

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

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

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

209
postfuturist

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

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

96
Antimony

Ну, в соответствии с этим отчет об ошибке 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.

43
Ajith

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

32
DataPriest

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

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

Примеры:

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

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

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

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

20
Nikola Petkanski

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

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

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

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

19
Balmipour

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

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

10
ungalcrys

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

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

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

6
kta

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

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

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

3
HTML Man

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

3
Daniel Egeberg

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

0
Alireza Rahmani Khalili