php string сравнение неожиданный тип жонглирование

Я столкнулся с необычным и неожиданным поведением в 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 это так, как это работает.