Кажется, что оператор PHP ===
чувствителен к регистру? Так есть ли причина использовать strcmp()
? Безопасно ли делать что-то вроде:
if ( $password === $password2 ) { ... }
Кажется, что оператор PHP ===
чувствителен к регистру? Так есть ли причина использовать strcmp()
? Безопасно ли делать что-то вроде:
if ( $password === $password2 ) { ... }
Причиной его использования является то, что strcmp
возвращает <0, если str1 меньше, чем str2; > 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, вы даже можете получить нуль.
<?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()
.
Быстрый googling кричит это сравнение скорости: http://snipplr.com/view/758/
Подводя итог всем ответам:
==
- плохая идея для сравнения строк.
Это даст вам "неожиданные" результаты во многих случаях. Не верьте ему.
===
отлично, и даст вам лучшую производительность.
strcmp()
следует использовать, если вам нужно определить, какая строка "больше", обычно для операций сортировки.
strcmp()
и ===
чувствительны к регистру, но ===
намного быстрее
пример кода: http://snipplr.com/view/758/
strcmp вернет разные значения в зависимости от среды, в которой он запущен (Linux/Windows)!
Причина в том, что у него есть ошибка, так как в отчете об ошибке говорится https://bugs.php.net/bug.php?id=53999
Обращайтесь с осторожностью! Спасибо.
Вы можете использовать strcmp()
, если хотите заказать/сравнить строки лексикографически. Если вы просто хотите проверить равенство, тогда ==
просто отлично.
Также функция может помочь в сортировке. Для более четкого определения сортировки. strcmp() возвращает меньше 0, если string1 сортирует перед string2, больше 0, если string2 сортирует перед строкой1 или 0, если они одинаковы. Например
$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);
Функция вернет больше нуля, поскольку aaao сортирует перед aabo.
PHP Вместо использования алфавитной сортировки, используйте значение ASCII символа для сравнения. Строчные буквы имеют более высокое значение ASCII, чем заглавные. Лучше использовать оператор идентичности === для такого сравнения. strcmp() - это функция для сравнения безопасных двоичных строк. Он принимает две строки в качестве аргументов и возвращает <0, если str1 меньше, чем str2; > 0, если str1 больше, чем str2, и 0, если они равны. Существует также версия без учета регистра с именем strcasecmp(), которая сначала преобразует строки в строчные, а затем сравнивает их.
Сравнение строк с помощью strcmp
echo strcmp("my name","my name");