php 函数返回值比较的一个问题

2015-03-04 16:32:31 +08:00
 liuhaotian
刚刚在写函数的时候发现一个奇怪的bug。是这样的。。
function t(){if (a) return 'taken'; else return false;}
然后 if (t()=='true')echo 1;发现假如返回taken的时候也会输出1,只有改===才可以,请问是什么原因?这里不是指针为什么必须要全等?
2834 次点击
所在节点    PHP
14 条回复
msg7086
2015-03-04 16:39:30 +08:00
指针?全等?你知道你在说什么吗…
haiyang416
2015-03-04 16:51:28 +08:00
使用 「==」 进行比较的时候 PHP 会自动转换类型。
liuhaotian
2015-03-04 17:04:29 +08:00
@haiyang416 那是左边的转换还是右边的转换?是左边的字符串被转换为布尔类型true所以等了吗?
@msg7086 在对象之间的关系比较的时候有等于==和全等===,这个比较的时候不是就是考虑到了指针存储地址的不同吗?
b821025551b
2015-03-04 17:13:41 +08:00
'taken'是什么?那个(a)里的a是变量?PHP指针是什么样的?你知道你在说什么吗...
b821025551b
2015-03-04 17:18:03 +08:00
我感觉你要表达的是这样的
<?php

function t() {
return 'taken';
}

if (t() == true)
echo 1;
?>

函数有返回值‘taken’,所以用==判断是成立的;但是返回值类型是字符串,而判断的是bool型的,所以判断不成立
mhycy
2015-03-04 17:22:07 +08:00
从头到尾没看懂说啥,a是哪来的。。。囧
另外,建议if加花括号,以保证流程按照预定方式运行并提高可读性。
haiyang416
2015-03-04 17:29:31 +08:00
wingoo
2015-03-04 17:32:57 +08:00
这程序可吐槽的地方太多了..
你说的问题是类型转换的事, 建议去看看文档 http://php.net/manual/zh/types.comparisons.php
jianghu52
2015-03-04 17:37:51 +08:00
按照楼主的写法写了一个测试页。结果
发现 如果写成 t()=='true' 不会输出 1,只有写成 t()==true 的时候,才会输出 1
我的php是5.4.25 的。
randyzhao
2015-03-04 17:45:52 +08:00
举个例子
case1: $a = "taken";
case2: $a = "";
case3: $a = null;
case4: $a = 0;
case5: $a = true;

等:
if ($a == ture) {
echo "true";
} else {
echo "false";
}
那么
case1 输出 "ture";
case2 输出 "false";
case3 输出 "false";
case4 输出 "false";
case5 输出 "ture";

全等:
if ($a === true) {
echo "true";
} else {
echo "false";
}
那么
case1 输出 "false";
case2 输出 "false";
case3 输出 "false";
case4 输出 "false";
case5 输出 "ture";

全等 "===" 必须是类型也相符, 才能成立.
而使用 "==" 进行判断时, 变量值为 空 || 0 || null 时, 才是 false.
msg7086
2015-03-04 17:57:16 +08:00
@liuhaotian 槽点太多不舍得吐太多。见楼上别人的解释吧。
反正,全等操作符根本不是你说的意思就对了。
hiboshi
2015-03-04 22:29:32 +08:00
php是弱类型语言 不强调 类型,单==时 会自动转换 比如 == 的时候1=true 但是 === 的时候 是不等于的
iyaozhen
2015-03-05 00:12:39 +08:00
@randyzhao 已经说的很全了。

另外不知道楼主 t()=='true' 是要干啥。
cevincheung
2015-03-05 10:46:25 +08:00
这类情况,在php中一般都是这么写的

if (t()).......

或者if (t() !== false) .....
或者if( t() === false).....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/174443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX