PHP代码:
<?php
$key = 0;
if($key == 'monty' && $key == 'anil'){
echo 'Mackraja';
}else{
echo "Nothing";
}
?>
或
<?php
$key = 2;
if($key == '2abc' || $key == 'abc2'){
echo 'Mackraja';
}else{
echo "Nothing";
}
?>
输出:Mackraja
答案 0 :(得分:9)
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较。这些规则也适用于switch语句。 - Source
这意味着
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
因此,当您将$key
(带值0
)与字符串进行比较时,字符串的值为0
,而它们都返回true 。通过这种方式,它将始终输出&#34; Mackraja&#34;。
将$key
的值更改为任何其他整数将返回false。
请注意
当比较为
===
或!==
时,不会进行类型转换,因为这涉及比较类型和值。 - Source
这意味着将比较运算符更改为===
意味着值必须完全匹配 - 即字符串1
不等于整数1 :他们必须匹配格式:
echo $key == 'monty' && $key == 'anil' ? 'Mackraja' : 'Nothing';
//will echo "Mackraja"
echo $key === 'monty' && $key === 'anil' ? 'Mackraja' : 'Nothing';
//will echo "Nothing"
答案 1 :(得分:3)
如果您将数字与字符串进行比较或比较涉及 数字字符串,然后每个字符串转换为一个数字和 比较数字化。 Reference
现在检查
<?php
$key = 0;
if($key === 'monty' && $key === 'anil'){
echo 'Mackraja';
}else{
echo "Nothing";
}
?>
你会得到输出“没什么”。
现在这些字符串的整数值为0,你可以在这里观察到。
<?php
$a = 'monty';
echo (int)$a; //0
怎么样? /为什么?
把这种情况从编程中解脱出来,解释一下,如何更好地发布,我正在尝试向你解释这个概念。
如果您遇到同质性原则,则表明如果它们的尺寸不同,则无法比较两个数量。
在编程中,你无法直接比较字符串和整数,需要将其转换为任何一个进行比较。
在PHP中,如果您将阅读手册,您可以注意到或者这是PHP的基本概念: -
PHP不要求(或支持)变量中的显式类型定义 宣言;变量的类型由上下文决定 使用变量。
对于比较运算符,当您甚至比较两个字符串(具有松散比较)时,将它们转换为整数然后进行比较您可以在参考页面“与各种类型的比较”表中注意到它
所以,我可以说比较运算符本身需要整数类型变量 对于comapre,这就是为什么将两个运算符与整数进行比较的原因。
$key = 2;
if($key == '2abc' || $key == 'abc2'){
echo '<br/>Mackraja';//outputs
}else{
echo '<br/>nothing';//does not output
}
现在,
$key = 200;
if($key == '2a2' ){
echo '<br/>' . $key . '== 2a2' . ' Equal';//does not output
}else{
echo '<br/>' . $key . '== 2a2' . ' Not Equal'; //outputs
}
和
$key = 200;
if($key == '2e2' || $key == 'abc2'){
echo '<br/>' . $key . '== 2e2' . ' Equal';//outputs Now it does not convert it to integer, it converts it to
}else{
echo '<br/>' . $key . '== 2e2' . " Not Equal";//does not output
}
现在
echo '<br/>'.'1E1'*1; //it outputs 10 why ??
echo '<br/>';
echo '<br/>1E1'*1; //it outputs 10 why ??
见下文: -
echo '<br/>cast to int 1E1 = ' . (int)1E1;//10
echo '<br/>Cast to int 1E2 = ' . (int)1E2;//100
//echo '<br />Cast to int 1A1 = ' . (int)1A1;//gives you error as can not be cast
//echo '<br />Cast to int 1A2 = ' . (int)1A2;//gives you error as can not be cast
echo '<br />Cast to int 1A1 = ' . (int)('1A1');//1
echo '<br />Cast to int 1A2 = ' . (int)('1A2');//1
echo '<br/>get int value 1E1 = ' . intval('1E1');//1
echo '<br/>get int value 1E2 = ' . intval('1E2');//1
echo '<br />get int value 1A1 = ' . intval('1A1');//1
echo '<br />get int value 1A2 = ' . intval('1A2');//1
“这不是关于从变量获取intvalue 如何投射变量。“
我正在给你另一个干净的桌子,你已经从我之前的reference link中看到过,在比较你如何从这里注意到不同类型的变量时你会注意到这一点。
如果您需要更多资源,最好的想法是找到源代码如何编写,您可以从中学到很多东西,以及为什么他们这样做可以由PHP小组更好地解答。
如果PHP不能隐式转换这些变量,可能会遇到像这种情况无法比拟的情况,如果你希望你的PHP表现得像这样,你可以制作自己的版本。
我正在添加表格,当比较松散变量时转换是如何发生的: -
答案 2 :(得分:2)
检查类型转换规则以进行宽松比较(与==进行松散比较):php type conversion rules
你会看到使用松散类型比较,整数0等于任何字符串......
答案 3 :(得分:2)
如果您将数字与字符串进行比较或比较涉及 数字字符串,然后每个字符串转换为一个数字和 比较数字化。这些规则也适用于交换机 声明。比较时不会进行类型转换 是===或!==因为这涉及比较类型以及 当您将$ key设置为0时,将以数字方式进行比较,即
(int)'monty' = 0
和(int)'anil' = 0
。
如果您想要正确的结果,请尝试此操作
$key = 0;
if($key === 'monty' && $key === 'anil'){
echo 'Mackraja';
}else{
echo "Nothing";
}
答案 4 :(得分:2)
如果将字符串与数字进行比较,则字符串将被转换为数字,并且检查/比较以数字方式完成
如果您仍然需要使用数据类型检查获得正确的输出,则可以使用“===”,如果如下所示将导致输出u期望为“Nothing”
<?php
$key = 0;
if($key === 'monty' && $key === 'anil'){
echo 'Mackraja';
}else{
echo "Nothing";
}
?>
这将输出:Nothing
答案 5 :(得分:1)
就这样做..
<?php
$key = 0;
if((string)$key == 'monty' && (string)$key == 'anil'){
echo 'Mackraja';
}else{
echo "Nothing";
}
?>
输出:
Nothing
答案 6 :(得分:1)
经过与同事的长时间讨论后,我们找到了解决方案
示例:
x2
说明:
在条件左操作数(2)与右操作数(ab2)匹配的情况下,如果 它在开头没有找到,那么输出将是假的,否则为真。
y[i,arr]
原因:
#1 var_dump("00005ab" == 5); // true
#2 var_dump("abc" == 0); // true
#3 var_dump(2 == "ab2"); // false
#4 var_dump(2 == "2ab"); // true