Операторы сравнения PHP и типы данных - PullRequest
2 голосов
/ 16 ноября 2009

В настоящее время я работаю с «Программированием PHP» О'Рейли и наткнулся на таблицу под названием «Тип сравнения, выполняемый операторами сравнения»:

First Operand              | Second Operand             | Comparison
-----------------------------------------------------------------------
Number                     | Number                     | Numeric
String that is numeric     | String that is numeric     | Numeric
String that is numeric     | Number                     | Numeric
String that is not numeric | Number                     | Lexicographic
String that is numeric     | String that is not numeric | Lexicographic
String that is not numeric | String that is not numeric | Lexicographic

Мое эмпирическое правило, для которого выполняется сравнение, было «числовым, если и только если хотя бы один операнд является числом или оба операнда являются числовыми строками». По-видимому, это поддерживается страницей php.net в Операторах сравнения , которая гласит: «Если вы сравниваете целое число со строкой, строка преобразуется в число. Если вы сравниваете две числовые строки, они по сравнению с целыми числами. "

Однако это будет означать, что сравнение в четвертом ряду таблицы должно быть «Числовым». Таблица содержит ошибку или мое правило неверно?

1 Ответ

3 голосов
/ 16 ноября 2009

Отредактировано: полное описание лица на основе комментариев.

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

Код ниже демонстрирует поведение


if (2 > '10 little pigs')
        print 'Integer does not coerce string'."\n";
else
        print 'Integer does coerce string'."\n";

if (2.5 > '10 little pigs')
        print 'Decimal does not coerce string'."\n";
else
        print 'Decimal does coerce string'."\n";

if (5/3 > '2 little pigs')
        print 'Rational result does not coerce string'."\n";
else
        print 'Rational result does coerce string'."\n";

if (0 == 'No little pigs')
        print 'Non numeric coerced to zero'."\n";
else
        print 'Non numeric not coerced'."\n";

if (-0.156 > '-127 is a minumum value of a signed 8 bit number')
        print 'Negative decimal does coerce string'."\n";
else
        print 'Negative decimal does not coerce string'."\n";

if ('-0.156' > '-127')
        print 'Both are converted if all numeric'."\n";
else
        print 'No conversion if both are all numeric'."\n";

if ('-0.156' > '-127 is a minumum value of a signed 8 bit number')
        print 'Successful conversion of one does coerce the other'."\n";
else
        print 'Successful conversion of one does not coerce the other'."\n";

...