PHP - использование is_numeric () необходимо, или можно использовать знаки сравнения для всех положительных числовых случаев? - PullRequest
3 голосов
/ 23 июля 2010

Кажется, что простые знаки сравнения >,>= и их обратные компоненты могут оценить, является ли определенная переменная числом или нет. Пример $whatami='beast'; ($whatami<0)?echo 'NaN':echo 'is numeric!';

Есть ли случаи, когда необходимо is_numeric() использовать для положительных значений (число> 0) ? Кажется, что использование знаков сравнения выше определит, является ли переменная числовой.

Ответы [ 4 ]

5 голосов
/ 23 июля 2010

Как я выяснил, многие из этих вспомогательных функций действительно необходимы, потому что PHP не является строго типизированным.Я опубликовал подобный вопрос (хотя не , который похож) о Исете ранее на этой неделе.Стоит отметить, что PHP изменит вашу строку на целочисленное значение для сравнения в некоторых случаях (когда есть смешанные типы).Это нельзя упускать из виду.Я думаю, что это сильный аргумент в пользу is_numeric

из PHP Manual

Если вы сравниваете число со строкой или сравнение включает числовые строки,затем каждая строка преобразуется в число, и сравнение выполняется численно.Эти правила также применяются к оператору switch.Преобразование типов не происходит, когда сравнение равно === или! ==, так как это включает в себя сравнение типа и значения.

Еще одна вещь, о которой следует подумать, это то, что "что равно 0"в PHP.Это значит многое.Это не всегда числовое.Это может быть числовая строка, логическое false, целое число и т. Д. Вот почему существуют эти вспомогательные функции.

Чтобы добавить в мой ответ:

, измените пример:

$whatami='beast';  
($whatami<5) ? echo 'less than 5' : echo 'more than 5';

PHP изменит 'beast' на его целочисленный эквивалент, а затем сделает сравнение.Это дало бы непредвиденные результаты.Если бы вы действительно хотели что-то подобное, вам нужно было бы обернуть это в другое условие:

$whatami='beauty';  
if(is_numeric($whatami){
    ($whatami<5) ? echo 'less than 5' : echo 'more than 5';
} else {
    exit('what, am I not pretty enough for a beast?');
}

Тогда вы получите желаемый результат (как бы странно это ни было).

2 голосов
/ 23 июля 2010

Существует большая разница между «можно оценить, является ли определенная переменная числом или нет» и «оценить, является ли определенная переменная положительным числом».Использование знаков сравнения требует, чтобы вы проверили его дважды (Оба > & <= или >= & <), и это может быть неочевидно сразу.is_numeric означает, что вам нужен только один тест, и делает совершенно очевидным, что вы делаете.

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

Согласно комментарию: Ну, в этом случае вы просите сравнить is_numeric с тестом для положительных чисел, исключая 0. Это ненамерение для is_numeric, поэтому, естественно, в этом нет необходимости.Если вы выполняете математическую проверку, которая включает 0 в качестве ответа или как часть диапазона, вам потребуется is_numeric, в противном случае он вам не понадобится.Первая часть вашего вопроса задает другой вопрос, поэтому:

Кажется, что простые знаки сравнения>,> = и их обратные компоненты могут оценить, является ли определенная переменная числом или нет - Неверно

Есть ли случаи, когда is_numeric() необходимо использовать для положительных значений (число> 0)? - Нет

Похоже, что использование приведенных выше знаков сравнения определит, является ли переменная числовой - Нет.Они могут определить, является ли переменная ненулевым числом или неизвестным , не числовым.

0 голосов
/ 26 июля 2010

Да, есть случаи.

Например:

var_dump("5aa" > 4); //bool(true)
var_dump("5aa" > 6); //bool(false)

Как видите, преобразование "5aa" в int(5). Давайте посмотрим, что дает is_numeric:

var_dump(is_numeric("5aa")); //bool(false)

Итак, is_numeric более строгий. Необходимость зависит от вашего приложения.

Обратите внимание, что случаи, когда числовая строка и число - это не одно и то же:

var_dump("255" & "2"); //string(1) "2" 
var_dump(255 & 2); //int(2)

См. битовые операции :

Помните о преобразованиях типов данных. Если левый и правый параметры являются строками, побитовый оператор будет работать со значениями символов ASCII.

0 голосов
/ 23 июля 2010

Сравнение будет зависеть от типа данных в левой части оператора.

Важно помнить, что PHP не строго типизированный язык. Если вы хотите сравнить число и убедиться, что это число, тогда да, is_numeric() будет хорошей проверкой. Например,

echo (is_numeric($whatami) && $whatami < 0) ? 'number greater than zero' : 'NaN or negative';

Однако это не следует обобщать. Если вы можете прокомментировать больше того, что вы хотите сделать, вы можете найти более подробный ответ.

...