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

PHP 中用 isset()和 empty()哪个更好

  •  
  •   OMGZui · 339 天前 · 3461 次点击
    这是一个创建于 339 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两者的区别,简单来说就是:

    isset(""); // true
    empty(""); // true
    
    isset([]); // true
    empty([]); // true
    
    isset(false); // true
    empty(false); // true
    
    isset(0); // true
    empty(0); // true
    
    isset("0"); // true
    empty("0"); // true
    

    个人认为empty()更合理,毕竟弱类型,要弱就弱到底呗,但是看到很多地方用isset(),包括那些开源框架

    第 1 条附言  ·  339 天前

    本人再次看了文档,发现了这个

    Note:

    在 PHP 5.5 之前,empty() 仅支持变量;任何其他东西将会导致一个解析错误。换言之,下列代码不会生效: empty(trim($name))。 作为替代,应该使用trim($name) == false.

    php5.5之后,没有警告会产生,哪怕变量并不存在。 这意味着 empty() 本质上与 !isset($var) || $var == false 等价。

    同时意味着empty() 可以一把梭了,没毛病吧

    58 回复  |  直到 2018-11-12 08:50:53 +08:00
        1
    realpg   339 天前   ♥ 1
    这俩不是一个功能,谢谢
        2
    barbery   339 天前
    服了,建议多看文档吧
        3
    richangfan   339 天前
    这俩不是一个功能,谢谢
        4
    helionzzz   339 天前   ♥ 1
    一个是检查是否为空,一个是检查是否赋值。。这俩在你看来是可以互相代替的嘛。。
        5
    shiny   339 天前
    区别没理解对,建议先啃下文档。
        6
    yiqiao   339 天前   ♥ 2
    楼主记住这贴是你的耻辱柱,233
        7
    alex321   339 天前   ♥ 5
    if (isset($data) && !empty($data)) { return $data;}

    isset 是检查有么有,empty 是检查有无赋值。。。。
    你直接用 if (!empty($data)) { return $data;} 会报 data 未定义的。
        8
    yunye   339 天前
    在楼主的学习生涯中强势 mark 一下
        9
    zsdroid   339 天前
    你来黑 php 的吧
        10
    ThirdFlame   339 天前
    看七楼的解释。
        11
    jevonszmx   339 天前
    哈哈,楼主会后悔发了这贴的。
        12
    gw1992225   339 天前
    同楼上 , 楼主下次发帖子好好看下 PHP 文档
        13
    mayday526   339 天前
    @yiqiao 哈哈哈哈,耻辱柱
        14
    JaguarJack   339 天前
    经此一贴,楼主从此放弃使用 php
        15
    suit   339 天前
    @alex321 empty 不会报错啊,只有 if ($data)才会报错
        16
    silencefent   339 天前
    $arr = [];
    var_dump(empty($arr['item'])); bool(true)
    var_dump(isset($arr['item'])); bool(false)
        17
    toxicant   339 天前
    算是知道 php 为什么招黑了...
        18
    OMGZui   339 天前   ♥ 2
    羞愧羞愧,一直以来都是把这两个混为一谈,empty()一把梭,在下学习了,好在问出来了。
        20
    poisedflw   339 天前   ♥ 1
    ```
    <?php

    # 1
    $data = [
    'key' => ''
    ];
    if (isset($data['key'])) {
    echo "not null";
    }
    if (!empty($data['key'])) {
    echo "not empty";
    }

    #2
    $data = [
    'key' => null,
    ];
    if (isset($data['key'])) {
    echo "not null";
    }
    if (!empty($data['key'])) {
    echo "not empty";
    }
    ```

    理解下。
        21
    seven2016   339 天前
    这个都没有区分清楚,这是要写下多少 bug 呀
        22
    airdge   339 天前
    一个变量存在 一个变量非空或非零
    两个功能不一样
        23
    WytheHuang   339 天前
    > empty 判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于 FALSE,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。

    手册看一遍吧。
        24
    WytheHuang   339 天前
    再上一条
    > 没有警告会产生,哪怕变量并不存在。 这意味着 empty() 本质上与 !isset($var) || $var == false 等价。
        25
    hubahuba   339 天前
    楼主 你这个号算是废了= = 要是让人家知道。。你有工作丢工作 没工作找不到工作= =
        26
    hubahuba   339 天前
    哈哈哈最关键的是一本正经的装逼 结果装逼失败
        27
    way2create   339 天前
    看英文也知道不能一概而论
        28
    OMGZui   339 天前
    @hubahuba 学习交流贴,话说我也没装逼吧
        29
    hubahuba   339 天前
    @OMGZui #28 楼主加油!
        30
    OMGZui   339 天前
    @way2create 是不能一概而论,主要是平时编码的时候都是判断变量是否为空,那么两个函数功能就是一样的
        31
    mayday526   339 天前
    @OMGZui 别人回复了一大圈,你还是没懂
        32
    freefcw   339 天前   ♥ 1
    都不懂什么叫做语义么,虽然都能做某件事,但是你代码要做什么,通过使用哪个函数就能区别出来

    我对这两个函数特别讨厌,因为滥用的人太多了,这两个函数功能太泛了,无法给出代码的含义
        33
    OMGZui   339 天前
    @freefcw 感谢指点,明白了
        34
    VeryZero   339 天前
    有这种情况是变量未定义。。
        35
    Seanfuck   339 天前
    从不用 empty,直接 if($x)。isset 需要时必须要用的
        36
    chairuosen   339 天前
    这俩玩意语意是相反的,有个判断有,一个判断无。你给出的全是结果相同的特例。居然能认为可以相互替换?
        37
    ruixingchen   339 天前
        38
    KiseXu   339 天前
    哥们,isset() 不等于 !empty(),
    比如 $x = ""; ,isset() 、empty() 结果都是 true

    官方文档有详细的比较: http://php.net/manual/zh/types.comparisons.php
        39
    klgd   339 天前
    ```
    $a = null;
    $b = 0;
    isset($a); // false
    isset($b); // true
    empty($a); // true
    empty($b); // true
    ```
        40
    mingyun   339 天前
    7 楼正解
        41
    topzyh   339 天前
    干脆
    if ( @$data ) {
    }
        42
    wuqingdzx   339 天前
    @alex321 高级黑? empty()不会抛出未定义异常
        43
    falcon05   339 天前 via iPhone
    如果你把错误报告的等级开到最高,你肯定会留意它们是不一样的
        44
    1070794219   338 天前
    empty(空数组) == true, 之前获取某一目录下的文章时,如果当前目录下没有文章(array 为[]),empty 判为 true, isset 为 true
        45
    1010011010   338 天前
    都不用。
    替代:
    if ($foo) {}
    if ($foo === null) {}
    行为一致,但更简洁

    报错?把你 notice 给我关了!
        46
    1010011010   338 天前
    当然要判断是否已定义时,还是使用 isset($foo) 而不是 $foo !== null
    都是为了可读性,兄弟
        47
    JasonTsang   338 天前
    应该是两个不一样的东西吧
    isset 不能跟 empty 混用,isset 是用来判断变量是否有定义的
    empty 是判断是否为空的
        48
    keepeye   338 天前
    顶上去
        49
    huobazi   338 天前 via iPhone
    平时都是你们黑 php,一有独秀的机会,都暴露了,都是 phper,哼哼
        50
    konakona   338 天前
    谁告诉你 empty 可以一把索?
    在强类型的语言里,一个没有声明过的变量拿来用,empty 就会报错。
    你可以将 PHP 的报错等级全开,你就明白了。

    撇开强弱类型,以 Laravel 这个框架来说。它的等级,也是开的比较高了的。所以你如果写

    <?php

    //$abc = '123';//隐藏掉声明
    var_dump(empty($abc));//一个你没有声明过的变量

    是会报错的,所以你要先 if(isset($abc)){var_dump(empty($abc));}

    这 2 个函数根本就不是一个意思。
        51
    konakona   338 天前
    简单来说,一个未声明过的变量,就是说,一个不存在的东西,不存在就是 null
    所以,var_dump($abc === null) 会是 true。

    一个不存在的东西,你怎么在程序里用?它会报错!告诉你这个东西不存在。

    所以我们可以用 isset($abc) 或者 $abc !== null 来让程序做一个判断,如果为真,代表这个变量存在(也就是声明它存在),那么就可以继续用它去做其他事,比如你说的 empty()。
        52
    konakona   338 天前
    isset() 就是 is set 这个意思呀~

    相当于是问程序,这个东西是不是(is) 声明过(set)的一个意思!

    而 empty(),就是相当于 is this empty ? 就是为里面的东西是不是空的?空是什么意思?空是 null、""、0。

    这又引发一个新的思考。

    null 就是 void 吗?不是。null 是一个特殊的类型。在其他语言里没有 null,在 php 里 null 被用来代表“无”。

    一个未声明的变量,你 var_dump 打印它。在弱环境下,会显示 null。在强类型环境下,会报错。为啥?因为没有声明呀~没有声明就是不可以用~~
        53
    konakona   338 天前
    补充一下。
    为什么弱环境里可以打印出未声明的变量为 null 这个结果呢?是因为弱类型语言,会自动转换类型。
    这是基础中的基础。
        54
    konakona   338 天前
    好比方说,我们这个世界不知道什么叫数学的“派”。
    在全世界都不知道(没有声明、没有发表、没有通知全世界)的时候,你疯狂的用派。全世界都不知道你想干什么,全世界都乱了。
    这就是程序里面为什么要先问“你知道派是什么吗?” 如果程序知道,就继续走用派的流程。如果程序不知道,你就写 else,并且为派声明。告诉大家,派是什么,介绍完毕后,也就能继续正常执行派的流程。
        55
    konakona   338 天前
    紧接着上面的例子好了……

    而 empty 又怎么理解?

    在全世界都知道有派的存在情况下,可能存在有些人只是听说过派,却不了解派。所以它对派的理解是“空”的( null )。

    这个时候你可以问这个人:

    if(isset($pai)){//你知道派吗?
    //他说知道。

    if(empty($pay)){//那你懂派吗?
    //不懂。。你告诉我
    $pay = '3.1415...';
    }else{
    //我懂
    echo $pai ;
    }
    }
        56
    realpg   338 天前
    @OMGZui #18
    态度良好 值得表扬

    说句题外话,其实看英语字面意思就能理解功能区别的 都不需要翻手册 以后加强英语学习
        57
    OMGZui   337 天前
    @konakona 感谢,回答了这么多,我已经理解了
        58
    wo642436249   336 天前
    @yiqiao 6666666
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2341 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 15:23 · PVG 23:23 · LAX 08:23 · JFK 11:23
    ♥ Do have faith in what you're doing.