Почему PHP преобразует две числовые строки в числа, прежде чем [свободно] сравнивать их?
Я просмотрел несколько подобных вопросов, но все они лишь констатируют факт:
Хорошо, я понял. Это объясняет , что происходит, когда '00001' == '1'
возвращает TRUE
.
Вопрос в том,: Почему PHP делает это?
В чем причина проверки строк на числовое значение, а затем кастинг, если да? Почему мы не можем просто сравнить уже две строки?
Я вполне могу понять, какое приведение требуется, если два операнда имеют разные типы. Но почему он делает "обычную математику", когда оба являются строками?
3 answers
Вы можете сравнить две строки.
"00001" === "1" // false
Помните, что ==
означает эквивалентно===
означает равно
Мое единственное предположение о том, почему это так, заключается в том, что в начале PHP стремился быть языком без типов, прежде чем они пошли по пути превращения в слабо типизированный язык.
PHP изначально был строковым процессором, который позволял создавать небольшие сценарии внутри него. Поскольку все входные данные в Интернете являются текстовыми по своей природе, ему пришлось много работать с учетом текстового ввода, чтобы вести себя разумно, когда дело касалось цифр.
Я могу ошибаться в этом, но я не верю, что возможность явного приведения типов данных появилась на этапе до PHP 4 с введением функций *val (например, intval) и т. Д. И я думаю, что нотация приведения, например (int)
, Появилась после этого.
Для операций, не связанных с сравнением, это было довольно просто, потому что все они имеют связанный с ними тип (+ - /* все имеют дело с числами, тогда как. имеет дело со строками) так что ясный путь к тому, как все должно быть сделано в этих случаях, очевиден.
Но с проверками равенства или эквивалентности между переменными тогда единственным способом сделать это было рассматривать все, что выглядело как число, как число, потому что в то время единственным способом его получения было бы извне, было бы как строка, и не было никакого способа сделать это иначе.
Потому что PHP создает продукт для конечных пользователей, а не для разработчиков приложений. Поэтому, когда вы производите такой продукт, как показано ниже:
if (isset($_POST['submit'])){
if ($_POST['myinput'] == "1") echo 'Yes'; //or == 1
else echo 'NO';
}
?>
<form name="myform" method="POST" action="">
<input name="myinput">
<input name="submit" type="submit">
</form>
Если пользователь введет 1
или 0001
, что вы ожидаете напечатать в обоих случаях? Yes
или NO
?
Ответ ясен. мы ожидаем увидеть Yes
. итак, это why PHP does so
Если по какой-либо редкой причине нам нужно определенно сравнить их, то мы должны изменить ==
на ===
Ах, наконец-то я понял. Это было довольно глупо с моей стороны.
Сравнение включает в себя не только "is equal"
, но также "less than"
и "greater than"
. И для последних двух, очевидно, важно привести числовые операнды перед сравнением, потому что числа часто представляются в PHP в виде строк, а 11 должно быть больше 9, даже если оба хранятся в строках.
Итак, как compare_function()
выполняет все сравнения сразу, возвращает либо 1, 0, -1
, чтобы определить, больше ли первый операнд, равно или меньше секунды соответственно - ну, это справедливо объясняет, почему операнды разыгрываются.