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


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

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

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

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

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

Author: Your Common Sense, 2013-06-02

3 answers

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

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

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

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

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

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

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

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

 4
Author: Orangepill, 2013-06-02 06:02:44

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

 3
Author: Amir, 2013-06-02 06:16:33

Ах, наконец-то я понял. Это было довольно глупо с моей стороны.

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

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

 3
Author: Your Common Sense, 2013-06-02 06:22:11