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

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

  •  
  •   OMGZui · 7 天前 · 2129 次点击

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

    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 条附言  ·  7 天前

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

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

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

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

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

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

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

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

    <?php

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

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

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

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

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

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

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

    这又引发一个新的思考。

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

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

    而 empty 又怎么理解?

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

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

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

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

    说句题外话,其实看英语字面意思就能理解功能区别的 都不需要翻手册 以后加强英语学习
        57
    OMGZui   5 天前
    @konakona 感谢,回答了这么多,我已经理解了
        58
    wo642436249   5 天前
    @yiqiao 6666666
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1924 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 22ms · UTC 02:13 · PVG 10:13 · LAX 18:13 · JFK 21:13
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1