Подтвердить что ты не робот

Почему PHP бросает две числовые строки в числа до [слабо], сравнивая их?

Я просмотрел несколько похожих вопросов, но все они только утверждают:

Если... сравнение включает числовые строки, то каждая строка преобразуется в число и сравнение выполняется численно.

Хорошо, я понял. В нем объясняется, что происходит, когда '00001' == '1' возвращает TRUE.

Вопрос: Почему PHP делает это?
В чем причина того, что строки зондирования будут числительными, а затем, если это так? Почему мы не можем просто сравнить две строки?

Я могу правильно понять, что нужно делать, если два операнда имеют разные типы. Но почему это " обычная математика", когда обе строки?

4b9b3361

Ответ 1

А, наконец, я понял. Это было довольно глупо.

Сравнение включает не только "is equal", но также "less than" и "greater than". И для последних двух, очевидно, важно бросать числовые операнды перед сравнением, потому что числа, которые часто представлены в PHP как строки, и 11 должны быть больше 9, даже если они сохранены в строках.

Итак, поскольку compare_function() выполняет все сравнения сразу, возвращает либо 1, 0, -1, чтобы определить, больше ли первый операнд, равен или менее секунды соответственно - ну, это справедливо объясняет, почему отливают операнды.

Ответ 2

Вы можете сравнить две строки.

"00001" === "1"  // false

Помните == означает, что эквивалент === означает равный

Мое единственное догадаться, почему это так, потому что в начале PHP стремился быть языком без текста, прежде чем они пошли по пути становления свободно набираемого языка.

PHP был изначально строковым процессором, который позволял немного скриптов внутри него. Поскольку все входные данные в Интернете являются текстовыми по своему характеру, он должен был усердно работать, учитывая, что текстовый ввод ведет себя разумно, когда дело касается чисел.

Я мог ошибаться в этом, но я не считаю, что способность явно вводить типы данных вступала в стадию до PHP 4 с введением функций * val (например, intval) и т.д., и я думаю, что кастингная нотация, например После этого появился (int).

Для операций без сравнения это было довольно просто, потому что у всех у них есть тип, связанный с ними (+ -/* все имеют дело с числами, а касается строк), поэтому четкий путь к тому, как вещи должны выполняться в этих случаях очевидный.

Но с проверкой равенства или эквивалентности между переменными единственным способом сделать это было рассмотрение всего, что выглядело как число, как число, потому что в то время, когда единственный способ, которым он мог быть получен, был бы внешне внешне как строка и не было никакого способа сделать это иначе.

Ответ 3

Потому что 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 Если по какой-то редкой причине нам нужно их явно сравнить, тогда мы должны изменить == на ===