昨天,我在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)
答案 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
检查设置变量并不是一个好习惯。我头脑中有两个原因:
isset
使意图明确 - 您正在检查变量是否已设置,而不是检查条件是否为真。if ($not_set)
时$not_set
将评估为false,但等于布尔false
。答案 2 :(得分:6)
如果您的变量已设置,您将遇到问题,但评估为FALSE,如下所示:
取自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
与未设置完全相同