这是一个OK测试,看看是否设置了变量

时间:2010-07-20 23:14:03

标签: php if-statement

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

如果我想检查变量是否有任何设置,使用isset()或其他辅助函数是否有效?这是一个“例如”:

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

而不是......

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

从变量的名称,您可以看到未设置此变量。因此条件将为false并且else部分将运行。到目前为止,我一直在使用这种做法,但在昨天的帖子之后,我现在得知这是错的。

这就是为什么我认为省略上面的isset()功能是一种不错的做法。从PHP手册:

  

if构造是其中之一   许多语言的重要特征,   PHP包括在内。它允许   条件执行代码   片段。 PHP的特色是if   结构类似于   C:

     

if(expr)语句

     

如关于的部分所述   表达式,表达式被评估   到它的布尔值。如果表达   计算结果为TRUE,PHP将执行   声明,如果它评估为   假 - 它会忽略它。更多   有关什么值评估的信息   可以在中找到FALSE   '转换为布尔值'部分。

从'转换为布尔部分':

  

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

     

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

如果这是一个不好的做法,为什么手册会不断说明未包含的变量?如果未设置,它将转换为NULL,因此由条件正确评估。使用isset()会得到相同的结果,但需要额外的周期才能完成。

有人可以告诉我这个问题我一直都是错的,为什么? (也许它有多糟糕,也许?)

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

编辑:谢谢大家(这很快)。老实说,我认为到目前为止所有的答案都很棒,并且不知道应该选择哪个答案......如果你的答案没有被选中,我仍然会投票:o)

5 个答案:

答案 0 :(得分: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()

答案 1 :(得分:7)

好的但使用if检查设置变量并不是一个好习惯。我头脑中有两个原因:

  1. 使用isset使意图明确 - 您正在检查变量是否已设置,而不是检查条件是否为真。
  2. 实际设置if ($not_set)
  3. $not_set将评估为false,但等于布尔false

答案 2 :(得分:6)

如果您的变量已设置,您将遇到问题,但评估为FALSE,如下所示:

       
  •            布尔 FALSE 本身          
  •    
  •            整数0(零)          
  •    
  •            浮点数0.0(零)          
  •    
  •            空字符串,和      字符串“0”          
  •    
  •            一个零元素的数组          
  •    
  •            一个零成员的对象      变量(仅限PHP 4)          
  •    
  •            特殊类型NULL(包括      未设定的变量)    
  •    
  •            从空创建的SimpleXML对象      标签    
  •   

取自PHP手册。

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

答案 3 :(得分:4)

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

如果设置了$not_set并且值为false的bool,则“测试”将失败!

答案 4 :(得分: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,其中null与未设置完全相同