true/false 在 PHP 中是如何工作的?

How does true/false work in PHP?

提问人:Moon 提问时间:3/5/2010 最后编辑:Catarina FerreiraMoon 更新时间:3/26/2021 访问量:151405

问:

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

PHP的

评论

5赞 Matt Ball 3/5/2010
说“true 定义为 1,false 定义为 0”的说法过于简单化。
3赞 Pavel Niedoba 11/5/2016
顺便说一句。猜猜这返回了什么: “false” == true

答:

11赞 Byron Whitlock 3/5/2010 #1

零为假,非零为真。

在 php 中,您可以使用 === 运算符更明确地测试。

if (0==false) 
    echo "works"; // will echo works

if (0===false) 
    echo "works"; // will not echo anything

评论

0赞 JavaSa 1/6/2015
为什么行不通?和 之间有区别吗?0 === false0 === false0 === FALSE
1赞 kungphu 5/9/2016
和 之间没有区别。两个 false 的计算结果相同;对于函数名称和语言关键字,PHP 不区分大小写,令人讨厌。这两种方法都“有效”,但它们的计算结果为 false,因为实际上执行的是类型相关的值检查。 允许类型之间的检查;请参阅此线程上接受的答案,了解 PHP 如何确定哪些匹配 false,哪些不匹配。0 === false0 === FALSE=====
132赞 Mark Byers 3/5/2010 #2

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

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

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

所有其他值都被视为 TRUE

评论

1赞 kungphu 5/9/2016
“程序员社区” != sh != bash 等。我曾经使用过的任何编程或脚本语言都没有这样的约定,即任何非零都是假的(当然,这并不意味着没有,但它是一个相当不错的样本集)。虽然我绝对更喜欢强类型,并且对 PHP 完全不能忍受,但“truthy”和“falsey”值在允许比较其他不可比类型的语言中非常常见,并且如何确定给定语言中给定类型的真实性可能非常随意。
2赞 TextGeek 5/13/2016
请注意,当@MarkByers说“字符串”0“时,这是完全正确的。例如,字符串“00”、“0.0”、“\0”等同样不会出现 false。
2赞 Exadra37 10/1/2019
您应该在答案中添加,要检查 var 是否真的是布尔值,必须与运算符一起使用严格比较,而不是常用的比较。=====
2赞 sidereal 3/5/2010 #3

PHP使用弱类型(它称之为“类型杂耍”),这是一个坏主意(尽管这是另一个时间的对话)。当您尝试在需要布尔值的上下文中使用变量时,它会根据此处提供的一些大部分任意规则将变量转换为布尔值: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

评论

8赞 Pascal MARTIN 3/5/2010
这个“坏主意”纯粹是主观的:一旦你知道这是如何工作的,在我看来,这绝对不是问题;-) ;;而且转换规则对我来说似乎并不合逻辑;-)
3赞 sidereal 3/5/2010
不要让我发布一个 stackoverflow 问题,关于弱打字的想法有多糟糕;)。考虑到 php 设法使基本的三段论失败,因为隐式类型转换使 php 相等性不可传递:echo (“true” == true)。\n“;真回声 (true == 1)。\n“;true echo (“true” == 1)。\n“;false :P
1赞 spronkey 3/5/2010
是的。。。对于新玩家来说,这是一个(潜在)非常危险的伎俩,但不一定是一个坏主意。我不打算在这里为代码的健壮性辩护,但有时它是一个很好的捷径。此外,如果你在更大规模的工作中做了很多工作,你可能会在大多数时候使用相等方法。
2赞 Anycorn 3/5/2010 #4

将运算符视为一元函数:返回 true 或 false,具体取决于特定类型和值的确切实现。考虑 if 语句通过句法糖隐式调用此类函数。is_false(type value)

另一种可能性是 type 具有强制转换运算符,它将 type 隐式转换为另一种类型,在本例中为 Boolean 字符串。

PHP 不公开这些细节,但 C++ 允许运算符重载,从而暴露运算符实现的细节。

4赞 Citizen 3/5/2010 #5

严格检查的最佳算子是

if($foo === true){}

这样,您实际上是在检查它是否为真,而不是 1 或只是设置。

22赞 akinuri 1/23/2019 #6

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

结果:

""         -> 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
  • 空字符串 () 是假的""
  • 仅包含 () 的字符串是假的0"0"
  • NAN是真实的
  • 空数组 () 是假的[]
  • 包含虚假值的容器(数组、对象、字符串)是真实的
    • 一个例外是(见第三项)0""

评论

0赞 Martijn van der Bruggen 5/26/2022
[“假”] ->真的,今天一直在咬我的脚。
0赞 Andrey Gritsay 5/14/2023
认为是愚蠢的,但不是'0'false'false'