PHP最佳实践中如何使用返回true或false的函数?

5

在学习 PHP 时,我发现 true 被返回为 1,false 被返回为 null。

echo (5 == 5) // displays 1
echo (5 == 4) // displays nothing

写返回 true 或 false 的函数时,有哪些最佳实践方法?比如:
function IsValidInput($input) {
  if ($input...) {
    return true;
  }
  else {
    return false;
  }
}

这是使用该函数的最佳方式吗?

if (IsValidInput($input)) {
  ...
}

你会如何编写相反的函数?
IsBadInput($input) {
  return ! IsValidInput($input);
}

什么情况下需要使用 === 运算符?

2
你至少提出了4个问题。你的“真正”的问题是什么? - Madbreaks
5个回答

5
在使用PHP时,返回值为1表示真(true),返回值为null表示假(false)是不准确的。与许多其他编程语言一样,PHP也有“真值”和“假值”,它们可以在与其他值比较时表现得像TRUEFALSE
这是因为PHP使用弱类型(相对于强类型)。当比较不同类型的值时,它会自动转换这些值,以便最终可以比较两个相同类型的值。当您在PHP中使用echo TRUE;时,echo将始终输出一个字符串。但是您传递了一个布尔值,必须在echo执行其工作之前将其转换为字符串。因此,TRUE自动转换为字符串"1",而FALSE转换为""
那么什么时候需要使用===运算符呢?
这种弱类型或宽松类型是 PHP 使用两个等号运算符 == 和 === 的原因。当您想要确保比较的两个值不仅“相等”(或等价),而且类型也相同时,使用 ===。实际应用中:
echo 1 == TRUE; // echoes "1", because the number 1 is a truthy value
echo 1 === TRUE; // echoes "", because 1 and TRUE are not the same type (integer and boolean)

当编写返回 true 或 false 的函数时,如何使用它们的最佳实践是什么?
在可能的情况下要精确,返回实际的布尔值 TRUE 或 FALSE。典型的情况是以 is 为前缀的函数,例如 isValidInput。人们通常期望这些函数返回 TRUE 或 FALSE。
另一方面,在某些情况下,使您的函数返回“假值”或“真值”很有用。例如,以 strpos 为例。如果它在零位置找到子字符串,则返回 0(int),但如果未找到字符串,则返回 FALSE(bool)。
$text = "The book is on the table";
echo (strpos($text, "The") == FALSE) ? "Not found" : "Found"; // echoes "Not found"
echo (strpos($text, "The") === FALSE) ? "Not found" : "Found"; // echoes "Found"

我认为这个问题应该得到更好的答案,所以我完全重写了我的回答。之前的版本在这里 - bfavaretto

2
function isValidInput($input){
    return ($input ...);   // if your test returns true/false, just return that result
}

您最后的示例缺少一个参数,否则很好:

function isBadInput($input){
    return !isValidInput($input);
}

谢谢。我已经修正了拼写错误。是的,这个函数并不是一个好的例子,但我只是想让例子更加明确。 - B Seven

1
1. 当然。除非你需要不同类型的结构,例如 while 循环。 2. 通常不需要。直接反转正常函数即可。 3. 当你需要区分 `false` 和 `0`、`''` 等时。

1
玩了一下 PHP 后,我发现 true 会返回 1,false 则返回 null。
不是这样的。true 和 false 会分别返回布尔值 true 和 false。当你输出时,必须将其转换为字符串以进行显示。根据手册
“布尔值 TRUE 被转换为字符串 '1'。布尔值 FALSE 被转换为空字符串 ''。这允许在布尔值和字符串值之间进行相互转换。”
至于其他方面:没问题,是的,是的,当你想要精确类型匹配时,避免在比较中进行类型转换,例如 "1" == true 是 true,但 "1" === true 是 false。

0
function isValidInput($input) {
  return ($input...);
}

if(isValidInput($input))
  ...

if(!isValidInput($input)) // never rewrite inverse functions
  ...

if(isValidInput($input) === false) {
  // Only run if the function returned a boolean value `false`
  // Does the same thing as above, but with strict typing.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接