21

我有一个功能:

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();

     if($row)
          $output = $row['somefield'];
     } else {
          $output = "error";
     }

     return $output;
}

//somewhere on another page...
if(is_numeric($class->CustomerRating()) {
     echo $class->CustomerRating;
} else {
      echo "There is an error with this rating.";
}

有没有更好的方法来查找错误?在这个函数中,如果没有返回任何行,它本身并不意味着“错误”,它只是意味着无法计算该值。当我检查函数的结果时,我觉得有一种更好的方法来检查返回的数据,然后再将其显示在 if 函数中。最好的方法是什么?我想返回一个“false”,但是在调用函数时我该如何检查呢?谢谢!

4

7 回答 7

11

There are (in my opinion) 2 common ways:

  1. Returning false
    Many builtin PHP functions do that

  2. Using SPL exceptions
    Evolved PHP frameworks (Symfony2, ZF2, ...) do that

于 2012-07-13T16:10:31.777 回答
5

你需要例外

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();
     if ($row !== null) {
          return $row['somefield'];
     } else {
          throw new Exception('There is an error with this rating.');
     }
}

// Somewhere on another page...
try {
    echo $class->CustomerRating();
} catch (Exception $e) {
    echo $e->getMessage();
}
于 2012-07-13T16:09:05.237 回答
3

使用例外。避免从函数和方法返回错误

于 2012-07-13T16:08:45.867 回答
3

尽管返回 false 以指示错误在 PHP 库中很普遍,但也有几个缺点:

  1. 您无法返回有关错误的描述
  2. 如果 false 值是函数的有效返回值,则不能使用这种方法

我在工作中看到的另一种方法是返回一个包含正常结果和可能错误的数组,基本上返回一对,但是要获得真正的结果,您必须从数组中检索它,这是编写更令人不快的代码

异常是这个问题的完整解决方案,但是为简单的错误编写 try...catch 块有点麻烦。对于记录为抛出异常的函数,如果在调用它时没有捕获异常,PhpStorm 会抱怨,所以我认为异常最好保留用于更严重的错误

返回结果和可能的错误的一种方法是使用按引用传递参数,这在 Objective C 中经常使用

/**
 * get element from array
  * @param $index int
  * @param $list array
  * @param $error object
  */
function getFromArray($index, $list, &$error=null) {
    if ($index >= 0 && $index < count($list)) {
        return $list[$index];
    }

    $error = "out of index";
    return null;
}

$list = ['hello', 'world'];

$error = null;
$result = getFromArray(-1, $list, $error);
if ($error) {
    echo "an error occurred " . $error;
} else {
    echo $result;
}

如果您不关心错误,则可以调用该函数而忽略错误参数

echo getFromArray(0, $list);
于 2019-02-13T02:17:23.257 回答
0

Try this out:

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();

     if($row){
         $output = $row['somefield'];
     } else {
         $output = false;
     }

     return $output;
}

//somewhere on another page...
if($class->CustomerRating() !== false) {
     echo $class->CustomerRating();
} else {
     echo "There is an error with this rating.";
}

This will make sure that it won't break if you return a zero.

于 2012-07-13T16:12:03.977 回答
0

我会使用例外——避免混乱。

于 2012-07-13T16:08:25.610 回答
0

处理错误的最好方法是抛出异常。这样你就可以有各种不同的错误并相应地处理它们。

然后你可以这样做:

try {
    $myvar = CustomerRating();
    //do something with it
} catch (Exception $e) {
    echo $e->getMessage();
}
于 2012-07-13T16:08:39.777 回答