Сравнение строк, содержащих пробел с == в переполнении стека

Мне любопытно, почему это происходит в PHP:

'78' == ' 78' // true
'78' == '78 ' // false

Я знаю, что это гораздо лучше использовать strcmp или наименее ===, Я также знаю, что когда вы сравниваете числовые строки с == они преобразуются в числа, если это возможно. Я также могу принять, что ведущий пробел игнорируется, поэтому (int)' 78' 78, и ответ верен в первом случае, но я действительно смущен, почему он ложен во втором.

я думал так '78' приведен к 78 а также '78 ' приведен к 78тоже, поэтому они одинаковы, и ответ верен, но, очевидно, это не так.

Любая помощь будет оценена! Заранее большое спасибо! 🙂

6

Решение

Кажется, все возвращается к этот 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;

Который имеет явный код для пропуска пробелов в начале, но не в конце.

7

Другие решения

Пробел в конце ’78 ‘заставляет PHP обрабатывать переменную как строку. Вы можете использовать trim (), чтобы убрать пробелы.

-1

По вопросам рекламы [email protected]