真/假在PHP中如何工作?

真/假在PHP中如何工作?,php,Php,我想知道PHP如何在内部处理true/false比较。 我知道true定义为1,false定义为0。 当我执行if(“a”){echo“true”}时,它会回显“true”。PHP如何将“a”识别为1 零为假,非零为真 在php中,可以使用运算符更明确地进行测试 if (0==false) echo "works"; // will echo works if (0===false) echo "works"; // will not echo anything 和的PH

我想知道PHP如何在内部处理true/false比较。 我知道true定义为1,false定义为0。
当我执行
if(“a”){echo“true”}
时,它会回显“true”。PHP如何将“a”识别为1

零为假,非零为真

在php中,可以使用运算符更明确地进行测试

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

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

和的PHP文档中介绍了这一点

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

  • 布尔值
    FALSE
    本身
  • 整数
    0
    (零)
  • 浮点数
    0.0
    (零)
  • 空字符串和字符串
    '0'
  • 零元素数组
  • 具有零成员变量的对象(仅限PHP 4)
  • 特殊类型
    NULL
    (包括未设置的变量)
  • 从空标记创建的SimpleXML对象
其他每一个值都被认为是真的

PHP使用弱类型(它称之为“类型杂耍”),这是一个坏主意(尽管这是另一次的对话)。当您尝试在需要布尔值的上下文中使用变量时,它会根据此处提供的一些主要任意规则将变量转换为布尔值:

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

另一种可能性是该类型具有强制转换运算符,它隐式地将类型转换为另一个类型,在本例中,将字符串转换为布尔值


PHP没有公开这些细节,但是C++允许操作符重载,从而公开了操作符实现的细节。

< P>严格检查的最佳操作符是

if($foo === true){}

这样,您就可以真正检查它是否为真,而不是1或只是设置。

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

结果:

""         -> 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蔬菜{}
等级水果{
公共$t=“s”;
}
等级水{
public$c=null;
}
$cases=[
"",
"0",
"0.0",
"1",
"01",
“abc”,
“真的”,
“假”,
“空”,
0,
0.1,
1.
1.1,
-42,
“南”,
(浮动)“南”,
楠,,
无效的
是的,
假,,
[],
[""],
["0"],
[0],
[null],
[“a”],
新的stdClass(),
新蔬菜(),
新水果(),
新水(),
];
“回声”。PHP_EOL;
foreach($cases作为$case){
printf(“%s->%s”.PHP\u下线,str\u-pad(json\u-encode($case),10,”,str\u-pad\u-RIGHT),json\u-encode($case==true));

}
说“真的定义为1,假的定义为0”太简单了。顺便说一句。猜猜结果是什么:“假”==true“坏主意”纯粹是主观的:在我看来,一旦你知道这是怎么回事,这绝对不是问题;-);;在我看来,转换规则似乎不太合乎逻辑;-)不要让我提出一个关于弱类型是多么糟糕的想法的问题;)。考虑到PHP设法使一个基本三段论失败,因为隐式类型转换使得PHP等式不可传递:ECHO(“true”=true)。真回声(真==1)。“\n”//真回声(“真”==1)。“\n”//错:是的。。。对于新手来说,这(可能)是一个非常危险的把戏,但不一定是个坏主意。我不打算在这里为代码的健壮性辩护,但有时这是一条很好的捷径。此外,如果你正在做大量的大规模工作,你可能会在大部分时间使用相等方法。为什么
0===false
不起作用?
0===false
0===false
之间也有区别吗?
0===false
0==false
之间没有区别。两个FALSE的评估值相同;令人讨厌的是,对于函数名和语言关键字,PHP不区分大小写。这两种方法都“有效”,但它们的计算结果为false,因为
==
实际上执行类型相关的值检查<代码>=允许在类型之间进行检查;有关PHP如何确定哪些匹配false,哪些不匹配,请参阅此线程上的公认答案。“程序员社区”!=嘘!=bash等等。我使用过的任何编程或脚本语言都没有一个约定,即任何非零的东西都是假的(当然这并不意味着没有,但这是一个相当不错的示例集)。虽然我肯定更喜欢强类型,对PHP一点也受不了,“truthy”和“falsey”值在语言中非常常见,这些语言允许比较不可比较的类型,并且在给定语言中如何确定给定类型的truthitude可能非常随意。请注意,当@MarkByers说“字符串“0”,这完全正确。例如,字符串“00”、字符串“0.0”、字符串“\0”“,等等。同样也不要出现错误。你应该在回答中补充一点,即要检查变量是否真的是布尔值,必须使用
===
运算符进行严格比较,而不是常用的
==
@Clonkex运算符。这是一个无意义的注释,谢谢你指出,我删除了它