OMGZui
V2EX  ›  PHP

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

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

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

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

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

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

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

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

    <?php

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

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

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

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

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

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

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

    这又引发一个新的思考。

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

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

    而 empty 又怎么理解?

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

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

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

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

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