提问人:Moon 提问时间:3/5/2010 最后编辑:Catarina FerreiraMoon 更新时间:3/26/2021 访问量:151405
true/false 在 PHP 中是如何工作的?
How does true/false work in PHP?
问:
我想知道PHP如何在内部处理真假比较。
我知道 true 定义为 1,false 定义为 0。
当我这样做时,它回响了“真实”。PHP 如何将 “a” 识别为 1 ?if("a"){ echo "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 === false
0 === false
0 === FALSE
1赞
kungphu
5/9/2016
和 之间没有区别。两个 false 的计算结果相同;对于函数名称和语言关键字,PHP 不区分大小写,令人讨厌。这两种方法都“有效”,但它们的计算结果为 false,因为实际上执行的是类型相关的值检查。 允许类型之间的检查;请参阅此线程上接受的答案,了解 PHP 如何确定哪些匹配 false,哪些不匹配。0 === false
0 === FALSE
===
==
132赞
Mark Byers
3/5/2010
#2
转换为布尔值时,以下值被视为 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 ));
}
总结:
- 当完成严格的 () 比较时,除 .
===
true
false
- 空字符串 () 是假的
""
- 仅包含 () 的字符串是假的
0
"0"
NAN
是真实的- 空数组 () 是假的
[]
- 包含虚假值的容器(数组、对象、字符串)是真实的
- 一个例外是(见第三项)
0
""
- 一个例外是(见第三项)
评论
0赞
Martijn van der Bruggen
5/26/2022
[“假”] ->真的,今天一直在咬我的脚。
0赞
Andrey Gritsay
5/14/2023
认为是愚蠢的,但不是'0'
false
'false'
评论