Похоже, что оператор PHP ==
чувствителен к регистру? Так есть ли причина использовать strcmp()
? Безопасно ли сделать что-то вроде:Сравнение строк с использованием == vs. strcmp
if ($password == $password2) { ... }
Похоже, что оператор PHP ==
чувствителен к регистру? Так есть ли причина использовать strcmp()
? Безопасно ли сделать что-то вроде:Сравнение строк с использованием == vs. strcmp
if ($password == $password2) { ... }
Причина использовать это потому, что strcmp
< возвращает 0, если str1 меньше, чем str2; > 0, если str1 больше str2 и 0, если они равны.
==
возвращает только true
или false
, он не скажет вам, что является «больше» строка.
icic tho в моем текущем случае, мне не нужно знать, какая строка больше :) –
strcmp с соответствующими строками занял 0.207852 секунды strcmp с несоответствующими строками занял 0.215276 секунд === с соответствующими строками взял 0.067122 секунды === с non -значения строк заняли 0.057305 секунд http://snipplr.com/view/758/ – 2013-04-22 17:00:09
Другое использование для strcmp показывает сортировку. Для более четкого определения сортировки. strcmp() возвращает <0, если string1 сортирует перед string2,> 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например, $ string_first = "aabo"; $ string_second = "aaao"; echo $ n = strcmp ($ string_first, $ string_second); вернется больше нуля, так как aaao сортирует перед aabo. –
Вы можете использовать strcmp()
, если Вы хотите заказать/сравнения строк lexicographically. Если вы просто хотите проверить равенство, то ==
все в порядке.
Как в [usort] (http://us2.php.net/manual/en/function.usort.php). Фактически, это в значительной степени сделано для сортировки. – Charles
@Charles Спасибо. Википедия заткнула мои глаза. – cbednarski
Первая часть права, но == is_not_ штраф за равенство. – postfuturist
Использование ==
может быть опасным.
Обратите внимание, что он переместит переменную в другой тип данных, если они отличаются друг от друга.
Примеры:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
Как вы можете видеть, эти два разных типов, но результат true
, который не может быть, что ваш код будет ожидать ,
Использование ===
, однако, рекомендуется, так как тест показывает, что он немного быстрее, чем strcmp()
и его нечувствительный к регистру вариант strcasecmp()
.
Быстрая вопит это прибегая к помощи сравнения скорости: http://snipplr.com/view/758/
Вы никогда не должны использовать ==
для сравнения строк. ===
в порядке.
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Просто запустите вышеуказанный код, и вы поймете, почему.
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
Теперь, это немного лучше.
== Это не просто проблема для разных типов. Это иногда дает неожиданные результаты, даже если обе стороны являются строкой. Попробуйте '1e3' == '1000' – Antimony
как 0 == 'password123'? –
@AndyLobel PHP использует код пароля123 для числа, используя его нечетные правила сравнения, поскольку другой операнд - это число, эта строка, как и большинство, коэрцирует число 0, а PHP возвращает true для сравнения. – postfuturist
strcmp вернет различные значения в зависимости от среды, в которой он работает (Linux/Windows)!
Причина в том, что она имеет ошибку, как сообщение об ошибке говорит https://bugs.php.net/bug.php?id=53999
Пожалуйста, обращаться с осторожностью !! Спасибо.
Он всегда будет возвращать 0, если строки равны. +1 за то, что вы заботитесь о любом другом значении, кроме 0. –
Не используйте == в PHP. Он не будет делать то, что вы ожидаете. Даже если вы сравниваете строки со строками, PHP неявно бросает их на float и выполняет численное сравнение, если они выглядят численно.
Например, '1e3' == '1000' возвращает true.
Хорошо .. В соответствии с этим php bug report, вы даже можете получить нуль.
<?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.
Ничего себе +1. Цитата из ссылки: «Установлено поведение для функции, которая получает неправильный тип аргументов (ы) для возврата null».Это удивительно, учитывая, что руководство просто говорит об этом: «Возвращает <0, если str1 меньше str2;> 0, если str1 больше str2 и 0, если они равны». Null не упоминается как возможность, но на страницах, таких как man-страница substr, упоминается. * sigh * – Gerry
Но делает то же самое, когда метод формы отправляется ...? – Nikhil
@NikhilGeorge It, функция в этом случае - strcmp. Не имеет значения, какие из них сравниваются. – r3dsm0k3
Всегда помните, что при сравнении строк, вы должны использовать ===
оператор (строгое сравнение) и не==
оператора (свободное сравнения).
На самом деле, я думаю, можно с уверенностью сказать, что вы должны использовать '===' при сравнении * ничего *. –
Также функция может помочь в сортировке. Для более четкого определения сортировки. strcmp() возвращает меньше 0, если string1 сортирует перед string2, больше 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например,
$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);
Функция вернет больше нуля, так как aaao сортирует перед aabo.
зЬгстр() и "===", чувствительны к регистру, но "===" гораздо быстрее
Пример кода: http://snipplr.com/view/758/
Сравнение строк с использованием STRCMP
echo strcmp("my name","my name");
Это вообще не отвечает на вопрос. – Pang
Подводя итог всем ответам:
==
- Плохая идея для сравнения строк.
Это даст вам «удивительные» результаты во многих случаях. Не верьте этому.
===
хорошо, и даст вам лучшее качество.
strcmp()
следует использовать, если вам нужно определить, какая строка «больше», как правило, для операций сортировки.
Что такое чувствительность к регистру, связанная с 'strcmp'? – kennytm
@KennyTM: 'strcmp' чувствителен к регистру. На некоторых языках, таких как VB, сравнение строк может и не быть, и таким образом возвратит другой результат. Однако это не относится к PHP. – cHao
@cHao: '=' в VB чувствителен к регистру, также язык не является. – kennytm