为什么在PHP中empty("0")返回true?

26
根据 PHP 文档,当调用 empty($var) 时,以下表达式会返回 true:
  • ""(空字符串)
  • 0(整数 0)
  • 0.0(浮点数 0)
  • "0"(字符串 0)
  • NULL
  • FALSE
  • array()(空数组)
  • $var(已声明但未赋值的变量)

我已经找到了使用empty($var) && $var != 0“解决”问题的方法,但是为什么 PHP 开发人员要这样做呢?

我认为这很荒谬,假设你有以下代码:

if (empty($_POST["X"])) {
    doSomething();
}

我认为"0"并不代表空,当什么都没有的时候才是空!

也许使用更加准确的字眼会更好。

if (isset($x) && x != "") {//for strings
    doSomething();
}

2
因为0也表示假。 - Charlotte Dunois
16
我不明白为什么会有人给这个问题投反对票,因为“空”的意思是缺少数据,而“0”是一个合法的字符串。因此,这是一个合理的问题。我也很想知道这背后的原因。 - Colin Basnett
2
因为这就是的定义方式。它本来可以不同,但它并没有/没有。有人可能会将Perl的错误值转换归咎为灵感的基础.. - user2864740
@user2864740 原作者和我都明白,问题在于为什么 empty 被定义成这样,因为 "0" 显然不是空的。 - Colin Basnett
2
因为 "" == 0 == 0.0 == "0" == null == false == array() == $var,所以 PHP 是弱类型语言。 - danronmoon
当他们决定将这个特性称为“empty”时(它并不是一个函数),字符串“'0'”并不是空的。 - Dr.Molle
1个回答

20

empty 大致相当于 PHP 中 FALSE 类型的值:

在转换为布尔类型时,以下值被视为 FALSE:

  • 布尔类型 FALSE 本身
  • 整数0(零)
  • 浮点数0.0(零)
  • 空字符串和字符串“0”
  • 一个元素个数为 0 的数组
  • ...

至于为什么 PHP 是这样工作的,或者为什么 empty 函数也是这样--好吧,那就是它的本质。

考虑使用 strlen($x) (特别适用于像 $_POST 这样的源都是字符串值) 来确定是否存在非空字符串,包括 "0"。

我最终使用的形式将会是: isset($x) && strlen($x),如果有任何其他附加处理,则知道存在一些 post 数据。


1
引号的使用会对实际值的数据类型产生重大影响。这也值得注意。 - Daryl Gill
谢谢,但关于布尔值我有同样的问题,为什么“0”被评估为假?但这不重要,我将通过使用strlen或== ""或其他方法来解决它...我想知道为什么PHP开发人员以那种方式设计了PHP。 - user2961204
因为 PHP 就是这么设计的 - 没有必要有合理的理由,选择只是出于历史原因。除非找到原始宣言或设计/笔记,否则此类决策通常会被遗忘,也不适合作为 SO 上的问题。每种语言都建立了真/假值的价值观,有些比其他的更严格:例如 Python/Ruby 采用了更狭义的 false-y 值定义。我怀疑 PHP 受到 Perl 的影响很大(当时是一种主导竞争对手),具有类似“古怪”值的特点。 - user2864740

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