V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuhaotian
V2EX  ›  PHP

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

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

    function t() {
    return 'taken';
    }

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

    函数有返回值‘taken’,所以用==判断是成立的;但是返回值类型是字符串,而判断的是bool型的,所以判断不成立
    mhycy
        6
    mhycy  
       2015-03-04 17:22:07 +08:00
    从头到尾没看懂说啥,a是哪来的。。。囧
    另外,建议if加花括号,以保证流程按照预定方式运行并提高可读性。
    wingoo
        8
    wingoo  
       2015-03-04 17:32:57 +08:00
    这程序可吐槽的地方太多了..
    你说的问题是类型转换的事, 建议去看看文档 http://php.net/manual/zh/types.comparisons.php
    jianghu52
        9
    jianghu52  
       2015-03-04 17:37:51 +08:00
    按照楼主的写法写了一个测试页。结果
    发现 如果写成 t()=='true' 不会输出 1,只有写成 t()==true 的时候,才会输出 1
    我的php是5.4.25 的。
    randyzhao
        10
    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
        11
    msg7086  
       2015-03-04 17:57:16 +08:00 via iPhone
    @liuhaotian 槽点太多不舍得吐太多。见楼上别人的解释吧。
    反正,全等操作符根本不是你说的意思就对了。
    hiboshi
        12
    hiboshi  
       2015-03-04 22:29:32 +08:00
    php是弱类型语言 不强调 类型,单==时 会自动转换 比如 == 的时候1=true 但是 === 的时候 是不等于的
    iyaozhen
        13
    iyaozhen  
       2015-03-05 00:12:39 +08:00
    @randyzhao 已经说的很全了。

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

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

    或者if (t() !== false) .....
    或者if( t() === false).....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   957 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:26 · PVG 04:26 · LAX 13:26 · JFK 16:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.