Я столкнулся с необычным и неожиданным поведением в PHP, сравнивая некоторые строковые значения. Первые два утверждения ниже возвращают true, когда я ожидаю, что они вернут false. Последний оператор возвращает false, как ожидалось. Я знаю о Juggling типа PHP, но то, что я понимаю из документов, заключается в том, что жонглирование типа происходит, когда вы сравниваете два разных типа данных, такие как строка и целое число. В приведенных ниже примерах, хотя оба литерала являются строками. Означает ли это, что когда вы выполняете сравнение строк в PHP, он проверяет обе строки, чтобы убедиться, что они выглядят как целые числа, и если они задают тип, отбрасывают оба из них в целые числа, а затем сравнивают эти целочисленные значения. Поэтому мой вопрос заключается в том, в каких условиях это поведение происходит, как точно работает сравнение строк в PHP?
var_dump("10" == "10.0000"); var_dump("10" == "+10."); var_dump("10" == "10 "); #output bool(true) bool(true) bool(false)
Обновления
Таким образом, ответ Бабы ниже сравнения предполагает, что числовые строки действительно помогли мне понять, что происходит. Функция is_numeric вернет вам, будет ли строка считаться числовой строкой. Интересно, что "10 "
не считается числовой строкой, но " 10"
. Я вырыл вокруг исходного кода PHP, и я считаю, что реализация is_numeric находится в функции is_numeric_string_ex. Из этого можно точно сказать, когда PHP будет обрабатывать строку как числовую строку.
Вы получаете ошибку из-за положения пространства, которое вернет true
var_dump("10" == " 10"); // true
Итак, если вы RUN
var_dump("10" == "10 "); //false
То, что вы на самом деле выполняете, связано с тем, что оно будет рассматриваться как строка
var_dump("10" == 0); //false
Это связано с тем, что тип juggling будет преобразовывать "10 "
в 0
это в документации PHP
ОТ PHP DOC
TRUE, если $ a равно $ b после манипуляции с типом.
Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразуется в число, а сравнение выполняется численно. Эти правила также применяются к оператору switch. Преобразование типа не происходит, когда сравнение === или! ==, поскольку это предполагает сравнение типа, а также значения.
Если вы хотите обмануть жонглирование типа
var_dump("10" == 0 + "10 "); // true
Это потому что
Примером автоматического преобразования типа PHP является оператор сложения «+». Если любой из операндов является поплавком, то оба операнда оцениваются как float, а результатом будет float. В противном случае операнды будут интерпретироваться как целые числа, а результат также будет целым числом. Обратите внимание, что это не изменяет типы самих операндов; единственное изменение заключается в том, как оцениваются операнды и каков тип самого выражения.
Я полагаю, что определенный ответ лежит где-то в обширности compare_function
в php-src / Zend / zend_operators.c и макросах, используемых там.
В этом случае все «строки», за исключением последнего, обрабатываются как поплавки или целые числа, а затем сравниваются. Вот почему строки 1 и 2 дают истину.
В строке 3 в строке есть пробел, а это означает, что для php это «реальная» строка, и эта строка сравнивает строки.
Мне тоже не нравятся loose typed
языки, но для php это так, как это работает.