简体   繁体   中英

PHP return false with a string

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.

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);
}

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;
}

I came up against this recently, my function would either return an error message as a string or return true like this:

function check_something(){
    if(condition){
        return 'error message';
    }
    // if we got this far all is good!
    return true;
}

I would call it and check the outcome like this:

$var = check_something();

if($var !== true){
    // $var is not boolean true, so it must be a string
    echo $var;
}

This checks that the outcome of the function is not just a truthy string, but is explicitly a boolean true

This could be useful to someone returning true or returning false as a string.

if (is_bool($result)) 
{
   echo 'Result is a true bool';
} 
else
{
   echo $result.'returning a string';
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM