V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
OMGZui
V2EX  ›  PHP

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

  •  
  •   OMGZui · Nov 9, 2018 · 6875 views
    This topic created in 2730 days ago, the information mentioned may be changed or developed.

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

    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(),包括那些开源框架

    Supplement 1  ·  Nov 9, 2018

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

    Note:

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

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

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

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

    isset 是检查有么有,empty 是检查有无赋值。。。。
    你直接用 if (!empty($data)) { return $data;} 会报 data 未定义的。
    yunye
        8
    yunye  
       Nov 9, 2018
    在楼主的学习生涯中强势 mark 一下
    zsdroid
        9
    zsdroid  
       Nov 9, 2018
    你来黑 php 的吧
    ThirdFlame
        10
    ThirdFlame  
       Nov 9, 2018
    看七楼的解释。
    jevonszmx
        11
    jevonszmx  
       Nov 9, 2018
    哈哈,楼主会后悔发了这贴的。
    gw1992225
        12
    gw1992225  
       Nov 9, 2018
    同楼上 , 楼主下次发帖子好好看下 PHP 文档
    mayday526
        13
    mayday526  
       Nov 9, 2018
    @yiqiao 哈哈哈哈,耻辱柱
    akagishigeru
        14
    akagishigeru  
       Nov 9, 2018
    经此一贴,楼主从此放弃使用 php
    suit
        15
    suit  
       Nov 9, 2018
    @alex321 empty 不会报错啊,只有 if ($data)才会报错
    silencefent
        16
    silencefent  
       Nov 9, 2018
    $arr = [];
    var_dump(empty($arr['item'])); bool(true)
    var_dump(isset($arr['item'])); bool(false)
    toxicant
        17
    toxicant  
       Nov 9, 2018
    算是知道 php 为什么招黑了...
    OMGZui
        18
    OMGZui  
    OP
       Nov 9, 2018   ❤️ 2
    羞愧羞愧,一直以来都是把这两个混为一谈,empty()一把梭,在下学习了,好在问出来了。
    poisedflw
        20
    poisedflw  
       Nov 9, 2018   ❤️ 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  
       Nov 9, 2018
    这个都没有区分清楚,这是要写下多少 bug 呀
    airdge
        22
    airdge  
       Nov 9, 2018
    一个变量存在 一个变量非空或非零
    两个功能不一样
    WytheHuang
        23
    WytheHuang  
       Nov 9, 2018
    > empty 判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于 FALSE,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。

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

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

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

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

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

    <?php

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

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

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

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

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

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

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

    这又引发一个新的思考。

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

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

    而 empty 又怎么理解?

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

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

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

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

    说句题外话,其实看英语字面意思就能理解功能区别的 都不需要翻手册 以后加强英语学习
    OMGZui
        57
    OMGZui  
    OP
       Nov 11, 2018
    @konakona 感谢,回答了这么多,我已经理解了
    wo642436249
        58
    wo642436249  
       Nov 12, 2018
    @yiqiao 6666666
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   925 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 158ms · UTC 23:22 · PVG 07:22 · LAX 16:22 · JFK 19:22
    ♥ Do have faith in what you're doing.