Мне любопытно, почему это происходит в PHP:
'78' == ' 78' // true
'78' == '78 ' // false
Я знаю, что это гораздо лучше использовать strcmp
или наименее ===
, Я также знаю, что когда вы сравниваете числовые строки с ==
они преобразуются в числа, если это возможно. Я также могу принять, что ведущий пробел игнорируется, поэтому (int)' 78'
78, и ответ верен в первом случае, но я действительно смущен, почему он ложен во втором.
я думал так '78'
приведен к 78
а также '78 '
приведен к 78
тоже, поэтому они одинаковы, и ответ верен, но, очевидно, это не так.
Любая помощь будет оценена! Заранее большое спасибо! 🙂
Кажется, все возвращается к этот is_numeric_string_ex
Функция С.
Начать с реализация ==
:
ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2) {
...
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
...
case TYPE_PAIR(IS_STRING, IS_STRING):
...
ZVAL_LONG(result, zendi_smart_strcmp(op1, op2));
Если оба операнда являются строкой, она вызывает zendi_smart_strcmp
…
ZEND_API zend_long ZEND_FASTCALL zendi_smart_strcmp(zval *s1, zval *s2) {
...
if ((ret1 = is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0, &oflow1)) &&
(ret2 = is_numeric_string_ex(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0, &oflow2))) ...
Какие звонки is_numeric_string_ex
…
/* Skip any whitespace
* This is much faster than the isspace() function */
while (*str == ' ' || *str == '\t' || *str == '\n' || *str == '\r' || *str == '\v' || *str == '\f') {
str++;
length--;
}
ptr = str;
Который имеет явный код для пропуска пробелов в начале, но не в конце.
Пробел в конце ’78 ‘заставляет PHP обрабатывать переменную как строку. Вы можете использовать trim (), чтобы убрать пробелы.