【问题标题】:Why does empty("0") returns true in PHP?为什么空(“0”)在PHP中返回true?
【发布时间】:2014-09-25 21:02:27
【问题描述】:

根据PHP文档,以下表达式在调用empty($var)时返回true

  • “”(空字符串)
  • 0(0为整数)
  • 0.0(0 作为浮点数)
  • “0”(0 作为字符串)
  • 空
  • 错误
  • array()(一个空数组)
  • $var; (声明的变量,但没有值)

我已经找到了如何使用empty($var) && $var != 0 来“解决”问题,但是为什么 php 开发人员会这样做呢?

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

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

我觉得"0"不是空的,空就是什么都没有!

也许用起来更好

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

【问题讨论】:

  • 因为0也意味着假。
  • 我不明白反对意见,这是一个合理的问题,因为“空”意味着缺少数据,而“0”是一个合法的字符串。我也很想知道这背后的原因。
  • 因为这是如何定义的。它可能会有所不同,但它是/不是。人们可能会将 perl 的 false-y 值转换归咎于灵感的基础......
  • @user2864740 原作者和我自己都明白,问题是为什么 empty 是这样定义的,因为"0" 显然不是空的。跨度>
  • 因为"" == 0 == 0.0 == "0" == null == false == array() == $var。 php 的类型很松散。

标签: php


【解决方案1】:

empty 大致反映 PHP's selection of FALSE-y values:

当转换为布尔值时,以下值被视为 FALSE:

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

至于 为什么 PHP 是这样工作的,或者 为什么 空函数也效仿 - 嗯,就是这样。

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

我使用的最终形式是:isset($x) && strlen($x),在知道有一些张贴数据的情况下应用任何其他处理。

【讨论】:

  • 引号的使用确实主要影响实际值的数据类型。也值得一提
  • 谢谢,但是关于布尔值我有同样的问题,为什么“0”被评估为假?但没关系,我打算通过使用 strlen 或 == "" 或其他什么来解决它......我想知道为什么 php 开发人员以这种方式设计 php
  • @user2961204 因为 PHP 就是这样 - 不需要合理的理由,选择是历史。除非找到原始宣言或设计/注释,否则此类决定通常会丢失并且不会提出好的 SO 问题。每种语言都建立了真/假值,有些比其他语言更严格:例如Python/Ruby 采用了更窄的 false-y 值定义。我怀疑 PHP 深受 Perl(当时的主要竞争对手)的影响,它有 similarly "quirky" values。
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 2011-05-04
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多