Сравнение строк через == И чего 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()
Если вы хотите заказать/сравниваем строки лексикографически. Если вы просто хотите проверить равенство, то ==
это просто прекрасно.