switch匹配问题 本帖最后由 xyang81 于 2011-09-18 14:42:30 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $a = '0';就可以得到 没有找到匹配的值! 了这与 php 默认在比较时忽略数据类型有关$a = 0;if($a == 'a') echo 'ok'; //这个 ok 是会输出的 本帖最后由 xuzuning 于 2011-09-18 14:51:48 编辑 应该跟 弱类型有关吧...俺不知道。在js 下测试了一下 js 没有这问题.... php比较的一些规则,更详细的见http://www.php.net/manual/zh/types.comparisons.php ca,好不容上传个图片。百度还防盗链?re,看网页吧,字符串和数值(非0)== 运算的结果是true. 你去看下php手册因为php里面的字符串转数字规则是:如果字符串以数字开头,则转为这个数字。例如:$a = (int)"2d2DD";var_dump($a);得到的结果是2.$a = (int)"d2DD";var_dump($a);得到结果是0.$a = (int)"a";var_dump($a);原理同上。如果$a = (int)"a";如果是c语言的语法,则:int b = (int)"a";得到的是97.php这里跟c是处理不一样。 $a = 0 ,$a 是int的 ,而你case里面却是string 当然不匹配了 实际上是匹配的。。是按照 ==来处理的,字符串和非0数值 ==的结果是false,和0 == 的结果是true 这个跟我觉得那个是一样,从本质来说,你的说的这个也是错得。如果是数值跟字符串比较,我觉得zend虚拟机,首先把字符串转为int,然后再进行比较。“字符串和非0数值 ==的结果是false”举个例子反驳这个观点:var_dump("5dfd"==5);得到结果是ture。你自己试下。“和0 == 的结果是true”再举个例子反驳你说的这个观点:var_dump("5dfadf"==0);得到的记过是false。你可以自己试一下,原因跟我七楼说的一样。 嘿,测试的有点偏了,只测试了像‘aaa’,'bb','sdfefe'这种字符串。刚测试了一下‘33333ddsdf',发现确实是false.看来结论有时候也不能下的太早啊。嘿嘿。 刚查资料补习了一下: 在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较. in_array()函数也有这个机制(还可以设置第三个参数打开in_array的强类型机制) 转换机制是这样的,那为什么将“a”强行转换成int型后,转换后值却是0呢??php里面的转换机制和底层又是怎么处理的呢???值得讨论 $a = 0;case "a":你可以去看下php的强制转换机制。你把$a和一个字符串比较。也就是一个整型和一个字符串比较。那么他的字符串被强制转换为整型。而字符串"a"转换为整型结果为0,所以相等了。这是php弱类型决定的。如果你想要得到正确的结果。你可以用if来判断。if($a==="a") { echo 'aaaa';}此时是不会输出的。应为“==”比较的只是值。“===”比较的是值以及类型。 是这样:$a = 0;$bool = ($a == 'a'); // notevar_dump($bool);if($a == 'a') { echo "AAA";}//note:整型数据和字符串数据比较时有一个规则:/** * 字符串与整型数字进行比较时, * 字符串会先转换为整型, * 如果字符串以数字开头,则将开头的数字作为该字符串的转换结果 * 如果字符串以非数字开头,则会在数值上转换为零 */ 这个是zend处理的,它要按照这样的规则,源码就这样实现。如果想看底层,那就去找找源码怎么写的吧。用c语言实现的。 怎么将包含中、韩文的字符串实体,反转回字符??? 怎么打开php script? 小弟向各位求教了:php遍历完文件后执行遍历的文件 请教谁会 php 调用 c 程序,调用c的一个小服务程序,需要提交请求和接收响应,高手指教 再次提问php 截取字符串的问题.(再加100分,如果解决两个贴子一起给分。) 為什麼隻有下面幾行語句,可是打開這個頁面好慢,根本顯示不出來 php5里的soap里SoapServer的构造函数里的第二个参数里的uri? 请问哪里有好一点的支持多用户的blog下载? 远程连接mysql数据库的问题 怎样取当前字段的值??50相送 apache中 设置 user agent为空的用户,在线等 关于hello world,希望大家帮个小忙,有分会再加
就可以得到 没有找到匹配的值! 了这与 php 默认在比较时忽略数据类型有关
$a = 0;
if($a == 'a')
echo 'ok'; //这个 ok 是会输出的
在js 下测试了一下 js 没有这问题....
因为php里面的字符串转数字规则是:如果字符串以数字开头,则转为这个数字。
例如:$a = (int)"2d2DD";
var_dump($a);得到的结果是2.$a = (int)"d2DD";
var_dump($a);得到结果是0.$a = (int)"a";
var_dump($a);
原理同上。
如果$a = (int)"a";如果是c语言的语法,则:int b = (int)"a";得到的是97.
php这里跟c是处理不一样。
实际上是匹配的。。是按照 ==来处理的,字符串和非0数值 ==的结果是false,和0 == 的结果是true
“字符串和非0数值 ==的结果是false”
举个例子反驳这个观点:var_dump("5dfd"==5);得到结果是ture。你自己试下。
“和0 == 的结果是true”
再举个例子反驳你说的这个观点:var_dump("5dfadf"==0);得到的记过是false。
你可以自己试一下,原因跟我七楼说的一样。
看来结论有时候也不能下的太早啊。嘿嘿。
在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较. in_array()函数也有这个机制(还可以设置第三个参数打开in_array的强类型机制)
case "a":
你可以去看下php的强制转换机制。
你把$a和一个字符串比较。
也就是一个整型和一个字符串比较。
那么他的字符串被强制转换为整型。而字符串"a"转换为整型结果为0,所以相等了。
这是php弱类型决定的。
如果你想要得到正确的结果。你可以用if来判断。
if($a==="a") {
echo 'aaaa';
}
此时是不会输出的。应为“==”比较的只是值。“===”比较的是值以及类型。
$bool = ($a == 'a'); // note
var_dump($bool);
if($a == 'a') {
echo "AAA";
}//note:整型数据和字符串数据比较时有一个规则:
/**
* 字符串与整型数字进行比较时,
* 字符串会先转换为整型,
* 如果字符串以数字开头,则将开头的数字作为该字符串的转换结果
* 如果字符串以非数字开头,则会在数值上转换为零
*/
如果想看底层,那就去找找源码怎么写的吧。用c语言实现的。