不混合返回值是一个很好的原则,但 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
返回一个字符串或布尔值false
。explode
返回 Array 或 boolean false
。如果任何事情都可能“出错”,几乎每个函数都可能返回不止一种类型。
现在,在编写自己的函数时,您应该只记住返回的任何内容都是有意义的。所以在你的例子中,返回字符串“没有找到这样的记录”会很奇怪。同样返回整数0
也没有任何意义,因为没有任何理由认为 ID 不能为空。返回false
ornull
都是有用的返回值。您可以通过以下方式轻松检查您是否获得有效身份证件:
$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 的灵活性,但始终确保您的函数返回的内容是合乎逻辑的。根据经验;没有任何解释或文档,您应该能够推断出返回值的含义,并且返回值应该是您可以使用的值(因此,当期望整数时,永远不要使用字符串,或者当期望数组时,不要使用整数,它只是没有意义)。如果您是主要人员,请抛出异常!