Сравнение строк через == И чего strcmp

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

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

11 ответов


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

возвращает 0, если str1 выглядит следующим образом больше, чем строка str2, и 0, если они равны.

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


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

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

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

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

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


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

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

хорошо..согласно этому отчет об ошибке 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.


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


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

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

примеры:

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

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

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

быстрый гуглинг кричит это сравнение скорости:http://snipplr.com/view/758/


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

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

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

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


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

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


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

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

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


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

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

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


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