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

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

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

    <?php
    error_reporting(E_ALL);

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

    if(isset($str) && !empty($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
    楼主,这是我活生生用脸皮换来的答案:
    https://www.v2ex.com/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   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:02 · PVG 13:02 · LAX 21:02 · JFK 00:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.