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

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

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

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

    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  
       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 哈哈哈哈,耻辱柱
    JaguarJack
        14
    JaguarJack  
       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()不会抛出未定义异常
    falcon05
        43
    falcon05  
       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  
       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   ·   实用小工具   ·   5323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:26 · PVG 17:26 · LAX 01:26 · JFK 04:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.