PHP 中用 isset()和 empty()哪个更好 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OMGZui
V2EX    PHP

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

  •  
  •   OMGZui 2018-11-09 16:40:28 +08:00 6550 次点击
    这是一个创建于 2533 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 条附言    2018-11-09 17:33:03 +08:00

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

    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
    realpg
        1
    realpg  
    PRO
       2018-11-09 16:43:49 +08:00   1
    这俩不是一个功能,谢谢
    barbery
        2
    barbery  
       2018-11-09 16:45:57 +08:00
    服了,建议多看文档吧
    richangfan
        3
    richangfan  
       2018-11-09 16:45:59 +08:00
    这俩不是一个功能,谢谢
    helionzzz
        4
    helionzzz  
       2018-11-09 16:46:35 +08:00   1
    一个是检查是否为空,一个是检查是否赋值。。这俩在你看来是可以互相代替的嘛。。
    shiny
        5
    shiny  
       2018-11-09 16:47:08 +08:00
    区别没理解对,建议先啃下文档。
    yiqiao
        6
    yiqiao  
       2018-11-09 16:48:52 +08:00   2
    楼主记住这贴是你的耻辱柱,233
    alex321
        7
    alex321  
       2018-11-09 16:49:26 +08:00   5
    if (isset($data) && !empty($data)) { return $data;}

    isset 是检查有么有,empty 是检查有无赋值。。。。
    你直接用 if (!empty($data)) { return $data;} 会报 data 未定义的。
    yunye
        8
    yunye  
       2018-11-09 16:50:45 +08:00
    在楼主的学习生涯中强势 mark 一下
    zsdroid
        9
    zsdroid  
       2018-11-09 16:55:08 +08:00
    你来黑 php 的吧
    ThirdFlame
        10
    ThirdFlame  
       2018-11-09 16:57:38 +08:00
    看七楼的解释。
    jevonszmx
        11
    jevonszmx  
       2018-11-09 17:01:56 +08:00
    哈哈,楼主会后悔发了这贴的。
    gw1992225
        12
    gw1992225  
       2018-11-09 17:05:47 +08:00
    同楼上 , 楼主下次发帖子好好看下 PHP 文档
    mayday526
        13
    mayday526  
       2018-11-09 17:07:16 +08:00
    @yiqiao 哈哈哈哈,耻辱柱
    akagishigeru
        14
    akagishigeru  
       2018-11-09 17:08:09 +08:00
    经此一贴,楼主从此放弃使用 php
    suit
        15
    suit  
       2018-11-09 17:09:44 +08:00
    @alex321 empty 不会报错啊,只有 if ($data)才会报错
    silencefent
        16
    silencefent  
       2018-11-09 17:11:03 +08:00
    $arr = [];
    var_dump(empty($arr['item'])); bool(true)
    var_dump(isset($arr['item'])); bool(false)
    toxicant
        17
    toxicant  
       2018-11-09 17:12:12 +08:00
    算是知道 php 为什么招黑了...
    OMGZui
        18
    OMGZui  
    OP
       2018-11-09 17:12:22 +08:00   2
    羞愧羞愧,一直以来都是把这两个混为一谈,empty()一把梭,在下学习了,好在问出来了。
    jfcherng
        19
    jfcherng  
       2018-11-09 17:12:40 +08:00
    poisedflw
        20
    poisedflw  
       2018-11-09 17:17:33 +08:00   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";
    }
    ```

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

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

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

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

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

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

    <?php

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

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

    这 2 个函数根本就不是一个意思。
    konakona
        51
    konakona  
       2018-11-10 14:25:05 +08:00
    简单来说,一个未声明过的变量,就是说,一个不存在的东西,不存在就是 null
    所以,var_dump($abc === null) 会是 true。

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

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

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

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

    这又引发一个新的思考。

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

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

    而 empty 又怎么理解?

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

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

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

    if(empty($pay)){//那你懂派吗?
    //不懂。。你告诉我
    $pay = '3.1415...';
    }else{
    //我懂
    echo $pai ;
    }
    }
    realpg
        56
    realpg  
    PRO
       2018-11-10 22:26:34 +08:00
    @OMGZui #18
    态度良好 值得表扬

    说句题外话,其实看英语字面意思就能理解功能区别的 都不需要翻手册 以后加强英语学习
    OMGZui
        57
    OMGZui  
    OP
       2018-11-11 14:04:16 +08:00
    @konakona 感谢,回答了这么多,我已经理解了
    wo642436249
        58
    wo642436249  
       2018-11-12 08:50:53 +08:00
    @yiqiao 6666666
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3824 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 04:14 PVG 12:14 LAX 21:14 JFK 00:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86