2010-07-26 3 views
257

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

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

Что такое чувствительность к регистру, связанная с 'strcmp'? – kennytm

+1

@KennyTM: 'strcmp' чувствителен к регистру. На некоторых языках, таких как VB, сравнение строк может и не быть, и таким образом возвратит другой результат. Однако это не относится к PHP. – cHao

+0

@cHao: '=' в VB чувствителен к регистру, также язык не является. – kennytm

ответ

260

Причина использовать это потому, что strcmp

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

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

+9

icic tho в моем текущем случае, мне не нужно знать, какая строка больше :) –

+120

strcmp с соответствующими строками занял 0.207852 секунды strcmp с несоответствующими строками занял 0.215276 секунд === с соответствующими строками взял 0.067122 секунды === с non -значения строк заняли 0.057305 секунд http://snipplr.com/view/758/ – 2013-04-22 17:00:09

+2

Другое использование для strcmp показывает сортировку. Для более четкого определения сортировки. strcmp() возвращает <0, если string1 сортирует перед string2,> 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например, $ string_first = "aabo"; $ string_second = "aaao"; echo $ n = strcmp ($ string_first, $ string_second); вернется больше нуля, так как aaao сортирует перед aabo. –

2

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

+1

Как в [usort] (http://us2.php.net/manual/en/function.usort.php). Фактически, это в значительной степени сделано для сортировки. – Charles

+0

@Charles Спасибо. Википедия заткнула мои глаза. – cbednarski

+6

Первая часть права, но == is_not_ штраф за равенство. – postfuturist

18

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

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

Примеры:

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

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

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

Быстрая вопит это прибегая к помощи сравнения скорости: http://snipplr.com/view/758/

+1

Иногда это отличает их от другого типа, даже если они уже имеют один и тот же тип. – Antimony

+0

, даже при сравнении двух строк, которые представляли целое число, такое как '' 012 "==" 12 "' php, изменили тип обеих строк на целое число 12 12, а затем вернули 'true'. – GoTo

190

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

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

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

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

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

+18

== Это не просто проблема для разных типов. Это иногда дает неожиданные результаты, даже если обе стороны являются строкой. Попробуйте '1e3' == '1000' – Antimony

+3

как 0 == 'password123'? –

+23

@AndyLobel PHP использует код пароля123 для числа, используя его нечетные правила сравнения, поскольку другой операнд - это число, эта строка, как и большинство, коэрцирует число 0, а PHP возвращает true для сравнения. – postfuturist

5

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

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

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

+0

Он всегда будет возвращать 0, если строки равны. +1 за то, что вы заботитесь о любом другом значении, кроме 0. –

90

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

Например, '1e3' == '1000' возвращает true.

+13

Но вы можете просто ===. –

+10

@Roman да, но многие программисты PHP не знают, что они должны это делать. Отсюда предупреждение. – Antimony

+0

@ Anthimony Итак, почему бы не рассказать им, что они * должны делать в вашем ответе? – Tim

39

Хорошо .. В соответствии с этим 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.

+3

Ничего себе +1. Цитата из ссылки: «Установлено поведение для функции, которая получает неправильный тип аргументов (ы) для возврата null».Это удивительно, учитывая, что руководство просто говорит об этом: «Возвращает <0, если str1 меньше str2;> 0, если str1 больше str2 и 0, если они равны». Null не упоминается как возможность, но на страницах, таких как man-страница substr, упоминается. * sigh * – Gerry

+0

Но делает то же самое, когда метод формы отправляется ...? – Nikhil

+0

@NikhilGeorge It, функция в этом случае - strcmp. Не имеет значения, какие из них сравниваются. – r3dsm0k3

29

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

+6

На самом деле, я думаю, можно с уверенностью сказать, что вы должны использовать '===' при сравнении * ничего *. –

3

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

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

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

-4

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

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

Это вообще не отвечает на вопрос. – Pang

9

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

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

  • === хорошо, и даст вам лучшее качество.

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