php 中见好多人判断变量需先判断 isset,这步能不能省略呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jookr
V2EX    PHP

php 中见好多人判断变量需先判断 isset,这步能不能省略呢?

  •  
  •   jookr 2015-02-23 14:02:36 +08:00 5571 次点击
    这是一个创建于 3960 天前的主题,其中的信息可能已经有所发展或是发生改变。

    <?php
    error_reporting(E_ALL);

    //下面省略不写isset($str),直接用empty判断如果$str不为空就干活也不会报错(即使变量$str从未声明或赋值),是否就是真的能省略不写isset($str)呢?或是为了需要向下兼容php版本(低版本----变量从未声明或赋值就empty($str)会报错)?

    if(isset($str) && !empt($str)){
    //do something...

    }

    简单就是想问 isset($str)能不能省略不写 直接判断(即使$str从未声明或赋值)

    18 条回复    2016-12-12 16:56:08 +08:00
    kslr
        1
    kslr  
       2015-02-23 14:12:05 +08:00 via Android
    可以啊 empty和isset作用是一样的,如果什么都不做处理就会有警告或者错误
    lincanbin
        2
    lincanbin  
       2015-02-23 14:17:00 +08:00 via Android
    Isset的功能是empty的子集,empty同样有检测变量是否定义的功能,Isset是为了避免变量未定义的情况下使用
    If($str == 1)
    这种情况会抛出一个可以忽略的异常,整个判断部分是不会执行的。
    你忽略了错误当然可以继续执行,可以以后运行上出现了什么偏差,你要负责。
    raincious
        3
    raincious  
       2015-02-23 14:18:43 +08:00
    楼主,这是我活生生用脸皮换来的答案:
    t/67309#reply48
    viko16
        4
    viko16  
       2015-02-23 14:22:20 +08:00
    文档里就有对比
    http://php.net/manual/zh/function.empty.php

    另外,
    不要为少打一两句代码而偷懒,没准以后你要为这花费百倍的时间去 fix
    Kilerd
        5
    Kilerd  
       2015-02-23 14:52:40 +08:00
    E_ALL,必须打开,这样才可以保证在所有环境下的正常运行
    我一般都是先isset,再去判断使用变量

    If(isset($str)&&''<>$str){
    do something...
    }
    bombless
        6
    bombless  
       2015-02-23 16:58:29 +08:00
    最开始我也以为很多情况下不写isset也没差。

    后面写着写着就发觉还是必须加isset,某些情况下用empty替代。

    反正楼主写对多了也许就改了,如果写了很多还是没改,那说明不写的那种方式实际更适合你。
    MaiCong
        7
    MaiCong  
       2015-02-23 18:47:23 +08:00
    function _isset($str){
    return isset($str) && !empty($str) ? $str : null;
    }
    if(_isset($str)){
    //do something...
    }
    zhengkai
        8
    zhengkai  
       2015-02-23 19:57:45 +08:00
    首先是 !empty 和 isset 只需要一个

    还有就是多设缺省值,比方说数组的

    function foo($bar) {
    $bar += [
    'a' => 0,
    'b' => 12,
    ];
    if ($bar['a'] > 5) { // 如果没有上面的 +=,这行就可能报错

    还有就是,引用到空值不会报错,但记得引用完要 unset

    $count =& $foo['bar']['key'];
    if ($count) {

    处理 notice 是挺烦的,但是任何 notice 都是需要解决的问题,要么规避错误,要么屏蔽错误(比方说跟网络相关的函数,你没法确认 $s = file_get_contents($url) 的各种网络问题,那就直接 @file_get_contents,然后着重检查 $s,从 PHP 5.4 以后 @ 的开销已经没bug了)

    建议开发的时候第二个显示器一直 `tail -f php_error.log`,有什么错误马上就能报告出来
    zhengkai
        9
    zhengkai  
       2015-02-23 19:58:40 +08:00
    缩进没了……我还一直能支持 markdown,原来只是主贴有
    raincious
        10
    raincious  
       2015-02-23 21:49:19 +08:00 via Android
    @MaiCong

    这样仍然是错的。

    isset是一种语法结构,只是看起来像是函数。他会进行变量(在变量表上)检查,而自己却不操作变量(包括读)。你定义的函数需要这个变量确实存在才能被压入执行栈(压入的时候就会给你E_NOTICE了)。

    一个毫无意义的"绕过"方法是让你的_isset接受一个Reference,接口变成这样:
    function _isset(&$str)
    这样可以确保不会丢出E_NOTICE,但实际上仅仅是因为PHP在压入$str这个Reference的时候发现没有而自动建立了一个变量而已。而这个Reference指向的值默认是NULL,isset对NULL返回false,于是你的函数 *看起来* 是工作了。

    如果你想进行一句话检查变量是否为空,那么直接用empty。然后你可以用is_string检查那个值是不是真的是string。
    rming
        11
    rming  
       2015-02-23 22:04:13 +08:00
    两个习惯:
    1.对用户输入检查 isset($_POST['key']);
    2.变量使用前声明
    $tmp = null;
    $arr = [];
    $str = '';
    Mars
        12
    Mars  
       2015-02-24 03:02:48 +08:00
    依稀记得 多年以前看过一个文章,说用isset更保险。。。
    bingfan
        13
    bingfan  
       2015-02-24 03:22:45 +08:00
    isset和empty在我们项目中都是禁止使用的函数,数组建议用array_key_exists,字符串直接if($str)
    cevincheung
        14
    cevincheung  
       2015-02-24 15:24:27 +08:00
    都不预定义变量的么?


    $str = $input->get('xxx');

    func get:
    return empty($_GET.....
    curiousjude
        15
    curiousjude  
       2015-02-25 08:53:55 +08:00
    @bingfan 能具体说一下为什么禁止吗?
    picasso250
        16
    picasso250  
       2015-03-05 15:32:58 +08:00
    @bingfan 你这个规定很奇葩呀。。。
    picasso250
        17
    picasso250  
       2015-03-05 15:36:18 +08:00
    楼主你还是代码写的少。

    当然,你肯定不服气。那就发明一个新语言吧。或者Haskell之类的有Maybe类型也不错的。
    vishun
        18
    vishun  
       2016-12-12 16:56:08 +08:00   1
    if(isset($str) && !empty($str))没必要这样写,直接 if(!empty($str))就可以。
    php 的 manual 中也说明了:"没有警告会产生,哪怕变量并不存在。 这意味着 empty() 本质上与 !isset($var) || $var == false 等价。",所以加上 isset 多此一举。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1207 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:24 PVG 01:24 LAX 09:24 JFK 12:24
    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