代码之家  ›  专栏  ›  技术社区  ›  TCCV

这是一个确定的测试,看看是否设置了一个变量

  •  8
  • TCCV  · 技术社区  · 15 年前

    昨天,我发了一个 answer 一个包含几个(当时我不知道)非常糟糕的代码示例的问题。从那以后,我一直在研究我对PHP的基本知识,这些知识让我认为这样的代码是可能的。这给我带来了一个我似乎找不到答案的问题:

    如果我想检查一个变量是否有任何集合,那么它是一个有效的实践吗 使用 isset() 或者另一个助手函数?这里有一个“例如”:

    if($not_set){
        //do something
    } else {
        //do something else
    }
    

    而不是。。。

    if(isset($not_set)){
        //do something
    } else {
        //do something else
    }
    

    从变量的名称中,可以看到未设置此变量。因此,条件是错误的,并且 else 部分会运行。到目前为止,我一直在使用这种做法,但经过昨天的帖子,我现在有了一个暗示,这是错误的。

    这就是为什么我认为把 ISSET() 上面的函数。从PHP手册:

    if构造是最 多种语言的重要特点, 包括PHP。它允许 代码的条件执行 碎片。PHP提供了一个if 结构类似于 丙:

    if(expr)语句

    如“关于”一节所述 表达式,计算表达式 它的布尔值。if表达式 计算结果为true,PHP将执行 语句,如果它的计算结果为 错误-它会忽略它。更多 关于价值评估的信息 可以在 “转换为布尔”部分。

    从“转换为布尔值部分”开始:

    转换为布尔值时 ,考虑以下值 假:

    … *特殊类型空(包括未设置的变量)

    如果这是一个糟糕的实践,为什么手册会不遗余力地声明包含未设置的变量?如果未设置,它将转换为空值,因此由条件正确计算。使用 ISSET() 将找到相同的结果,但需要额外的周期来完成。

    有人能告诉我这段时间我是不是错了,为什么?(可能有多糟?)

    谢谢,所以,你永远不会失望的。

    编辑:谢谢大家(很快)。我真的认为到目前为止所有的答案都很好,不知道该选哪一个来回答…如果你的没有被选中,我还是会投赞成票:o)

    5 回复  |  直到 15 年前
        1
  •  6
  •   Jamison Dance    15 年前

    如果设置了变量,则会遇到问题,但计算结果为false,如下所示:

    • 布尔函数 错误的 它本身
    • 整数0(零)
    • 浮动0.0(零)
    • 空字符串,以及 字符串“0”
    • 零元素数组
    • 零成员的对象 变量(仅限php 4)
    • 特殊类型空(包括 取消设置变量)
    • 从空创建的SimpleXML对象 标签

    取自PHP手册。

    基本上,使用isset()表示显式检查变量是否存在且不是空值,而if语句的结构仅检查变量是否为真。它更清晰,更不容易出错。

        2
  •  12
  •   Felix Kling    15 年前

    如果未设置变量,则 Notice . 如果你使用 isset() 你没有得到通知。因此,从错误报告的角度来看,使用 ISSET() 更好的是:

    例子:

    error_reporting(E_ALL);   
    if($a) {
       echo 'foo';
    }
    

    给予

    Notice: Undefined variable: a in /Users/kling/test on line 5
    

    反之

    error_reporting(E_ALL);
    if(isset($a)) {
       echo 'foo';
    }
    

    不输出任何内容。


    底线:如果代码质量对您很重要,请使用 ISSET() .

        3
  •  7
  •   casablanca    15 年前

    它是 可以 但不适合使用 if 检查集合变量。有两个原因让我无法相信:

    1. 使用 isset 明确目标-您要检查变量是否设置,而不是检查条件是否为真。
    2. if ($not_set) $not_set 实际设置,但等于布尔值 false .
        4
  •  4
  •   Michael Mrozek    15 年前

    这是一种常见的做法,但并不好——你应该经常使用 isset !

    如果你 $not_set 已设置,并且是具有值的bool false ,您的“测试”将失败!

        5
  •  1
  •   deceze    15 年前

    isset 作为一个保护,防止您使用实际上不存在的变量。
    if (isset($foo)) if ($foo) 不要说同样的话。 伊塞特 只告诉你变量是否真的存在,如果可以使用它,它不会计算变量本身的值。 * .

    因此,通常应使用以下两种模式之一:

    如果变量确实存在并且您只想检查其值:

    if ($foo == 'bar')
    

    如果变量可能存在,也可能不存在,并且要检查其值:

    if (isset($foo) && $foo == 'bar')
    

    如果你只是对一个变量感兴趣 被设定 并评估为 true ,即 如果($FO) ,你可以使用 empty :

    if (isset($foo) && $foo)
    // is the same as
    if (!empty($foo))
    

    * 它会检查 null 在哪里 无效的 就像完全不被设置一样好