真/假在PHP中是如何工作的?

php
2022-08-30 09:10:26

我想知道PHP如何在内部处理真/假比较。我理解true被定义为1,false被定义为0。当我这样做时,它呼应“真实”。PHP 如何将“a”识别为 1?if("a"){ echo "true";}


答案 1

这在布尔值和类型比较表 PHP 文档中有所介绍。

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

  • 布尔值本身FALSE
  • 整数(零)0
  • 浮点数(零)0.0
  • 空字符串和字符串“0”
  • 具有零元素的数组
  • 成员变量为零的对象(仅限 PHP 4)
  • 特殊类型(包括未设置的变量)NULL
  • 从空标签创建的 SimpleXML 对象

所有其他值都被视为 TRUE


答案 2

因为我已经多次访问了这个页面,所以我决定发布一个示例(松散的)比较测试。

结果:

""         -> false
"0"        -> false
"0.0"      -> true
"1"        -> true
"01"       -> true
"abc"      -> true
"true"     -> true
"false"    -> true
"null"     -> true
0          -> false
0.1        -> true
1          -> true
1.1        -> true
-42        -> true
"NAN"      -> true
0          -> false
NAN        -> true
null       -> false
true       -> true
false      -> false
[]         -> false
[""]       -> true
["0"]      -> true
[0]        -> true
[null]     -> true
["a"]      -> true
{}         -> true
{}         -> true
{"t":"s"}  -> true
{"c":null} -> true

测试代码:

class Vegetable {}

class Fruit {
    public $t = "s";
}

class Water {
    public $c = null;
}

$cases = [
    "",
    "0",
    "0.0",
    "1",
    "01",
    "abc",
    "true",
    "false",
    "null",
    0,
    0.1,
    1,
    1.1,
    -42,
    "NAN",
    (float) "NAN",
    NAN,
    null,
    true,
    false,
    [],
    [""],
    ["0"],
    [0],
    [null],
    ["a"],
    new stdClass(),
    new Vegetable(),
    new Fruit(),
    new Water(),
];

echo "<pre>" . PHP_EOL;

foreach ($cases as $case) {
    printf("%s -> %s" . PHP_EOL, str_pad(json_encode($case), 10, " ", STR_PAD_RIGHT), json_encode( $case == true ));
}

总结:

  • 进行严格()比较时,除返回之外的所有内容。===truefalse
  • 空字符串 () 是 falsy""
  • 仅包含 () 的字符串是 falsy0"0"
  • NAN是真实的
  • 空数组 () 是假的[]
  • 包含 falsy 值的容器(数组、对象、字符串)是真实的
    • 这是一个例外(请参阅第三项)0""

推荐