真/假在PHP中如何工作?
我想知道PHP如何在内部处理true/false比较。 我知道true定义为1,false定义为0。真/假在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
当我执行
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对象
将运算符视为一元函数:
为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运算符。这是一个无意义的注释,谢谢你指出,我删除了它