我的代码中有以下内容:
$mixed = array();
$mixed[0] = "It's a zero!";
$mixed['word'] = "It's a word!";
foreach ($mixed as $key => $value) {
if ($key == 'word') {
echo $value.'<br />';
}
}
以上由于某种原因打印出“它是零!”和“这是一个字!”。我期待它只打印“这是一个字!”。这是为什么??我觉得我错过了一些重要的东西。当我在if语句中使用===
时,它按预期工作,换句话说,它只打印“这是一个单词!”。我知道相等和相同的运算符之间存在差异,但第一个例子不相同吗?
答案 0 :(得分:5)
==
在比较之前为您进行类型转换。
当您使用整数==
执行0
时,它会将'word'
转换为相应的整数值。
intval()
在提供纯字符串时返回 0 ,因此匹配为0。另一个在字符串上下文中匹配,也匹配。
===
执行没有这样的隐式转换,因此只有在一种情况下,当字符串实际上相同时才返回true。
答案 1 :(得分:1)
PHP变量有类型。
==
在转换为相同类型后检查相等性,===
也检查类型。使用var_dump
查看实际类型。
答案 2 :(得分:1)
见上文@Cthulhu的回答很明显。
除此之外,这是一个不同的例子。
strpos()函数返回needle
haystack
的位置。
<?php
$pos_a = strpos('apple', 'a'); // a is in the first position.
$pos_b = strpos('apple', 'b'); // there is no b.
if ($pos_a){
echo 'we got a!'."\n";
}
if ($pos_b){
echo 'we got b!'."\n";
}
如果找不到针, strpos
会返回FALSE
。但是你会看到php没有运行任何echo语句。
如果您var_dumo()
了解这两个值,您会看到$pos_a
和$pos_b
包含0
和FALSE
。
if
语句失败,因为0
和FALSE
都被视为FALSE
,除非您使用===
现在试试这个:
<?php
$pos_a = strpos('apple', 'a'); // a is in the first position.
$pos_b = strpos('apple', 'b'); // there is no b.
if ($pos_a !== FALSE){
echo 'we got a!'."\n";
}
if ($pos_b !== FALSE){
echo 'we got b!'."\n";
}
现在你会看到所需的结果,因为它回声“我们得到了!”。
答案 3 :(得分:0)
$ a == $ b如果在类型杂耍后$ a等于$ b,则等于TRUE。 $ a === $ b如果$ a等于$ b,则相同为TRUE,它们属于同一类型。
看起来
如果对带有==的字符串检查0,则PHP返回true:
php -r'var_dump(0 ==“status”);' - &GT;返回TRUE
但如果您的字符串在开头有一个数字,则不会这样:
php -r'var_dump(0 ==“2statuses”);' - &GT;返回FALSE
从规范我得到它尝试转换 - 在这种情况下字符串编号。
更好用===