在php中,为什么空(";0";)返回true?

在php中,为什么空(";0";)返回true?,php,string,isset,Php,String,Isset,根据php文档,调用empty($var) “”(空字符串) 0(0作为整数) 0.0(0作为浮点数) “0”(0作为字符串) 空的 假的 array()(空数组) $var;(声明了一个变量,但没有值) 我发现了如何通过使用empty($var)&&$var!=0但php开发人员为什么要这么做? 我认为这很荒谬,希望你有这样的代码: if (empty($_POST["X"])) { doSomething(); } 我认为“0”不是空的,空的是什么都没有的时候!!! 也许用它更

根据php文档,调用
empty($var)

  • “”(空字符串)
  • 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();
}
empty

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

  • 布尔值本身是假的
  • 整数0(零)
  • 浮动0.0(零)
  • 空字符串和字符串“0”
  • 零元素数组
至于为什么PHP会这样工作,或者为什么空函数也会这样做——好吧,就是这样

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


我使用的最后一种形式是:
isset($x)和&strlen($x)
,在知道有一些post数据的情况下应用任何附加处理。

因为0也意味着false。我不理解否决票,这是一个合法的问题,因为“空”意味着缺少数据,而“0”是一个合法的字符串。我也想知道这背后的原因,因为这就是它的定义。本来可以有所不同,但事实并非如此。有人可能会责怪perl的false-y值转换是灵感的基础。@user2864740原作者和我都明白,问题是为什么
empty
是这样定义的,因为
“0”
显然不是空的。因为
“==0==0.0==0”==null==false==array()=$var
。php是松散类型的。引号的使用主要影响实际值的数据类型。同样值得一提的是,关于布尔,我有一个相同的问题,为什么“0”被计算为假?但没关系,我要用strlen或==“”或其他什么来解决它。。。我想知道为什么php开发人员用这种方式设计phpway@user2961204因为这就是PHP的现状——不需要有理性的理由,选择就是历史。除非找到原始宣言或设计/注释,否则此类决定通常会丢失,因此无法解决问题。每种语言都建立了真/假-y值,有些比其他语言更严格:例如Python/Ruby采用了更窄的假-y值定义。我怀疑PHP受到Perl(当时的主要竞争对手)的严重影响,而Perl已经受到了影响。