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

TCC*_*CCV 8 php if-statement

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

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

if($not_set){
    //do something
} else {
    //do something else
}
Run Code Online (Sandbox Code Playgroud)

而不是...

if(isset($not_set)){
    //do something
} else {
    //do something else
}
Run Code Online (Sandbox Code Playgroud)

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

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

if构造是许多语言最重要的特性之一,包括PHP.它允许条件执行代码片段.PHP的if结构类似于C的结构:

if(expr)语句

如关于表达式的部分所述,表达式被计算为其布尔值.如果expression的计算结果为TRUE,那么PHP将执行语句,如果计算结果为FALSE,它将忽略它.有关哪些值评估为FALSE的更多信息,请参阅"转换为布尔值"部分.

从'转换为布尔部分':

转换为布尔值时,以下值被视为FALSE:

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

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

有人可以告诉我,这一直是我一直都错了,为什么?(可能有多糟糕?)

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

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

Fel*_*ing 12

如果没有设置变量,你得到一个Notice.如果您使用isset(),则不会收到通知.所以从错误报告的角度来看,使用isset()更好:)

例:

error_reporting(E_ALL);   
if($a) {
   echo 'foo';
}
Run Code Online (Sandbox Code Playgroud)

Notice: Undefined variable: a in /Users/kling/test on line 5
Run Code Online (Sandbox Code Playgroud)

error_reporting(E_ALL);
if(isset($a)) {
   echo 'foo';
}
Run Code Online (Sandbox Code Playgroud)

不输出任何东西.


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


cas*_*nca 7

使用检查设置变量是可以的但不是好的做法if.我头脑中有两个原因:

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


jer*_*son 6

如果设置了变量,您将遇到问题,但计算结果为FALSE,如下所示:

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

摘自PHP手册.

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