2010-07-20 78 views
8

昨天,我发布了一个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设有如果 结构,它是类似于的 C:

如果(表达式)语句

正如在节约 表达式所描述的,表达被评估 其布尔值。如果表达式 的计算结果为TRUE,则PHP将执行 语句,如果它的计算结果为 FALSE - 它将忽略它。更多 有关将 设置为FALSE的值的信息可在 “转换为布尔值”部分找到。

而且从 '转换为布尔值一节':

当转换为boolean ,以下值被认为是 FALSE:

... *特殊类型NULL(包括未设置的变量)

为什么手册不能说明未设置变量如果这是一个不好的做法,包括bles?如果未设置,它将转换为NULL,因此可以通过条件进行正确评估。使用isset()将会找到相同的结果,但会花费额外的周期来完成。

有人能告诉我我整个过程是否错误,为什么? (也许它有多糟?)

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

编辑:谢谢大家(这很快)。我真的认为迄今为止所有的答案都很好,不知道应该选择哪个答案......如果你没有选中,我仍然会赞成:o)

+0

好吧null一样好,你的做法*会*捕未设置变量,但它也会捕获* *设置的其他变量。所以这不是一个真正的变量被设置的测试 – Gareth 2010-07-20 23:23:07

+0

另请参阅http://stackoverflow.com/questions/1960509/isset-and-empty-make-code-ugly – deceze 2010-07-20 23:25:37

+0

嘿欺骗!感谢昨天的一切 - 我的PHP理解有了巨大的飞跃(如你所见)。我在搜寻时没有看到那个,但是我想的基本上是一样的。 – Tim 2010-07-20 23:31:02

回答

6

,如果你的变量设置您将在运行到问题,但计算结果为FALSE,如下所示:

  • 布尔FALSE本身
  • 的整数0(零)
  • 浮点数0。0(零)
  • 空字符串,和 串
  • 用零个元素
  • 零个构件 变量的对象(PHP阵列4只)
  • 特殊类型NULL(包括 尚未设定的变量)从空 标签

从PHP手册两者创建

  • 的SimpleXML对象。

    基本上,使用isset()显示您明确检查变量是否存在并且不是NULL,而if语句的结构只检查变量是否为true。它更清晰,更不容易出错。

  • +0

    'isset'检查一个变量**是否存在**(*设置*),而不是'null'。 *设置*部分比* not'null' *部分重要得多。 – deceze 2010-07-21 00:11:28

    +0

    感谢您的澄清。编辑,以补充说明。 – jergason 2010-07-21 01:05:24

    12

    如果变量没有设置,你会得到一个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()

    4

    这是一种常见做法,但并不好 - 您应该始终使用isset

    如果您的$not_set已设置,并且是值为false的布尔,则您的“测试”将失败!

    7

    这是好吧但不好的做法是使用if检查设置变量。有两个原因把我的头顶部:

    1. 使用isset使意图明确的 - 你正在检查的变量是否被设置,而不是代替检查条件是否为真。
    2. if ($not_set)将在$not_set实际设置但等于布尔型false时评估为false。
    +0

    +1提示意图。 – 2010-07-20 23:22:51

    1

    isset作为一名警卫,阻止您使用实际不存在的变量。
    if (isset($foo))if ($foo)并不意味着同样的事情。 isset只是告诉你变量是否实际存在,如果可以使用它,它不会评估变量本身的值*

    因此,你通常应该使用这两种模式中的一种:

    如果变量是肯定存在的,你只是要检查它的值:

    if ($foo == 'bar') 
    

    如果变量可能会或可能不会存在,并且要检查它的价值:如果你只是感兴趣的一个变量设置

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

    和评估为true,即if ($foo),您可以使用empty

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

    *它并检查null,在不被设置在所有

    相关问题