PHP return false with a string

12,804

Solution 1

Does php assume false if a var is set to anything besides true?

Not at all. PHP will return whatever the variable was set to. And actually since you have a non-empty string, that's a "truthy" value (ie: true in a boolean context). Since you used if ($result) as your check and you return a "truthy" value, the condition is always true. You need to change that check to:

if ($result === true) {
    ...

What is the correct way to handle this?

I think it's a good enough way to handle it. An alternative would be to pass an error string variable by reference, and have the fail part of your code fill that, eg:

function check($var, &$error) {
    if ($var == 1) {
        return true;
    } else {
        $error = 'This is not the correct answer. You supplied ' . $var;
        return false;
    }
}

Some native PHP functions behave like this (eg: exec().) Yet another alternative is to return an array with the errors, like Jared suggested. I personally use this option when I expect multiple errors (eg: a form validation routine):

function check_stuff($stuff) {
    $errors = array();
    if (!$condition1) {
        $errors[] = 'Condition 1 failed';
    }

    if (!$condition2) {
        $errors[] = 'Condition 2 failed';
    }

    return $errors;
}

Now you can also take advantage of the fact that empty arrays are falsy:

$errors = check_stuff($your_stuff);
if (!$errors) {
    echo 'No errors!';
} else {
    print_r($errors);
}

Solution 2

You can use === to check if the returned value is boolean true. === checks the type as well the value.

if ($result === true)
{
    echo 'Correct!';
}
else
{
    echo $result;
}
Share:
12,804

Related videos on Youtube

Ed R
Author by

Ed R

Webmaster and computer programmer in php, C#, VB, Java, Javascript.

Updated on June 18, 2022

Comments

  • Ed R
    Ed R almost 2 years

    I am looking for the correct way to handle a return statement with a bool/string. For example I do all my checking inside the function and return true if it all passes. However if something went wrong I would like to return a string of what went wrong rather than just return false; with a general string. Does php assume false if a var is set to anything besides true? What is the correct way to handle this? Here's an example of what I'm doing

    <?php
    $a = 2;
    
    $result = CheckVar($a);
    if ($result)
    {
        echo 'Correct!';
    }
    else
    {
        echo $result;
    }
    
    function CheckVar($var)
    {
        if ($var == 1)
        {
            return true;
        }
        else
        {
            return 'This is not the correct answer. You supplied '.$var;
        }
    }
    ?>
    

    It seems this method works, however is this good programming etiquette? Or is there another way I should be doing this? Thank you for your time.

    • NullUserException
      NullUserException over 12 years
      @zzzzBov Exceptions are expensive. Don't throw an exception unless you have a very good reason to.
    • NullUserException
      NullUserException over 12 years
      @zzzzBov Using exceptions also uglifies your code. IMO it makes no sense to throw an exception if "the answer is not correct." Exceptions should be used to handle code that doesn't behave the way it's supposed to - thus the name "Exception." You fully expect the answer to be incorrect.
    • Jared Farrish
      Jared Farrish
      You need to understand falsy values in PHP (Javascript, also). stackoverflow.com/questions/699507/…
  • Jared Farrish
    Jared Farrish over 12 years
    Although I have approached this in different ways over the year's, in this case I might want to return an array of errors from the function, and then test the return result for how many array member's it has. This way, I don't have to maintain two different contexts (the argument and the return value).
  • NullUserException
    NullUserException over 12 years
    @Jared I also use arrays when I anticipate multiple errors (eg: a form validator).
  • Ed R
    Ed R over 12 years
    This works well, though it seems pass-by-reference variables are better practicing standards. Thank you for your help.

Related