1

对于返回“未找到此类记录”的函数,PHP 中的最佳返回值是多少?

考虑这个问题的简短示例:

function getLatestPostId()
{
    $postId = Db::latestPostId();
    return (is_null($postId)) ? null : $postId;
    // Is returning null the best option?
}

我通常的方法是 return null,但我正在混合integernull尽可能返回函数的类型。

我在别处读过的相关原则:

  • 不要返回混合类型(例如,如果需要布尔值,则始终返回布尔值,而不是空值)
  • 如果返回一个数组,但没有找到任何项目,则返回一个空数组
4

5 回答 5

3

如果没有最新的帖子,回到这里并没有什么根本上的错误,null而且这不是一个有问题的状态。返回混合类型是 PHP 等语言的优势之一,如果滥用它可能会导致问题,但恕我直言,这不是滥用。

最重要的是要保持一致:不要混合标量和数组作为返回值,不要混合原始类型和对象类型。

从理论上讲,如果总是应该存在最新的帖子,那么返回混合类型将是一种报告错误情况的机制;在这种情况下,事情开始变得不那么明确,并且可能会引发异常。

于 2013-07-18T08:58:22.880 回答
1

取决于找到数据时的“预期返回类型”。

  1. 如果您通常返回一个 int(用于 id、计数等),bool 值(存在)在第一种情况下返回 null,在第二种情况下返回 false,因此您可以使用类似的方法对其进行评估if(!result)

  2. 如果您通常返回一个数组,则返回一个空数组。

你使用什么风格并不重要,只要它有意义并且你坚持下去。如果它在您的整个应用程序中是一致的并且对您有用,那就没问题了!

于 2013-07-18T08:57:48.870 回答
1

真的取决于你的应用程序。你需要身份证吗?在这种情况下抛出异常。您的应用程序可以在没有 ID 的情况下运行吗?只需返回null并处理它。

于 2013-07-18T09:08:33.367 回答
0

不混合返回值是一个很好的原则,但 php 本身也没有坚持这一点。它更像是一个通用的编程原则,对于 C 和 Java 等其他编程语言来说是一个严格的原则。例如,在 Java 中,一个函数(或方法,就像在那里调用的那样)只能返回一种变量类型,并且函数封装看起来像这样强制它(注意int方法名称前面的,它定义了预期的返回值) :

public int getLatestPostId() { // ... }

如果你想告诉调用者没有找到任何东西(通过给出警告,或者如果你想更严格,通过说这是一个错误)你将不得不抛出一个异常。

Php 与其他编程语言有点不同,因为它对变量类型非常灵活。在示例中查看此 php 代码:

$my_var = 12; // now i'm an integer
$my_var = 12 .' is a number'; // now i'm a string

什么都没做,变量突然变成了一个字符串。如果你想在 Java 中做同样的事情,你必须做这样的事情:

int myInteger = 12;
String myString = myInteger + " is a number";

如您所见,您必须声明另一个变量。这是由于 Java 为您的整数保留了一定的内存空间,该整数具有最小和最大大小。然而,字符串(它不是原始数据类型)实际上可以具有任何大小。Php 为您处理所有这些,因此您不必担心它,也不必提前告诉您的变量持有什么样的值。

现在看一些php函数。例如,如果出现问题,该函数date返回一个字符串或布尔值falseexplode返回 Array 或 boolean false如果任何事情都可能“出错”,几乎每个函数都可能返回不止一种类型。

现在,在编写自己的函数时,您应该只记住返回的任何内容都是有意义的。所以在你的例子中,返回字符串“没有找到这样的记录”会很奇怪。同样返回整数0也没有任何意义,因为没有任何理由认为 ID 不能为空。返回falseornull都是有用的返回值。您可以通过以下方式轻松检查您是否获得有效身份证件:

$the_latest_post_id = getLatestPostId();
if(!$the_latest_post_id) {
    // tell the user there was no latest post, or something went wrong while fetching it
}

在 Java 中这是不可能的,因为返回值应该是整数,而不是布尔值,即使出现问题。解决方案; 抛出异常。PHP 也允许你这样做。因此,如果您想要干净并接近您的原则,请使用 throw-catch 块:

function getLatestPostId() {
    // try to fetch the post id
    if($no_post_id_found) {
        throw new Exception('No last post id found...');
    }

    // all set, return the id!
    return $last_post_id;
}

try {
    $post_id = getLatestPostId();
} catch (Exception $e) {
    echo 'Something went wrong: '. $e->getMessage();
}

这种方式总是返回一个整数,除非抛出异常,但函数将不返回任何内容,甚至不返回 void。

总结:使用 php 的灵活性,但始终确保您的函数返回的内容是合乎逻辑的。根据经验;没有任何解释或文档,您应该能够推断出返回值的含义,并且返回值应该是您可以使用的值(因此,当期望整数时,永远不要使用字符串,或者当期望数组时,不要使用整数,它只是没有意义)。如果您是主要人员,请抛出异常!

于 2013-07-18T09:31:11.167 回答
0

这个怎么样,因为===(检查值和类型)许多 PHP 自己的函数的发明返回FALSE或预期的值,不管它可能是什么。

如果你养成使用这个结构的习惯,一切都会好起来的

$x = function();
if ( $x === FALSE ) {
    // error situation
} else {
    // all is well proceed
}

当然更好的方法是使用异常throw catch。那么在错误情况下返回的数据类型是标准的,即异常对象。

function getLatestPostId()
{
    $postId = Db::latestPostId();
    if (is_null($postId))  {
        throw new Exception('PostId is not available');
    }
    return $postId;
}

.... 

try {
    $x = getLatestPostId();
    // code when postid is available goes here
}
catch Exception($e) {
    // when posyId is not available do this
}
于 2013-07-18T09:09:00.710 回答