Search code examples
phpmathevaluationnumericisnumeric

PHP - usage of is_numeric() necessary, or can use comparison signs work for all positive numeric cases?


It seems that simple comparison signs >,>= and their reverse components can evaluate if a certain variable is a number or not. Example $whatami='beast'; ($whatami<0)?echo 'NaN':echo 'is numeric!';

Are there cases where is_numeric() usage is necessary for positive values (number >0)? It seems that using comparison signs above would determine if the variable is numeric..


Solution

  • As I have been finding out, a lot of these helper functions are really necessary because PHP isn't strongly typed. I posted a similar question (although not that similar) about isset earlier this week. One thing to note is that PHP will change your string to its integer value for comparisons during some instances (when there are mixed types). This can't be overlooked. I think this is a strong case for is_numeric

    from PHP Manual

    If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value.

    Another thing to think about is that "what is 0" in PHP. It means a lot. It's not always numeric. It may be a numeric string, boolean false, integer, etc... This is why those helper functions exist.

    To add to my answer:

    change your example:

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

    PHP would change 'beast' to its integer equivalent and then do the comparison. This would give unintended results. If you really wanted something similar, you'd have to wrap it in another conditional:

    $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?');
    }
    

    Then you would get your intended result (as weird as it may be).