【问题标题】:Is this an OK test to see if a variable is set这是一个 OK 测试,看看是否设置了变量
【发布时间】:2011-03-18 17:32:41
【问题描述】:

昨天,我在一个问题上发布了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 结构类似于 C:

if (expr) 语句

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

从“转换为布尔部分”:

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

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

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

有人可以告诉我我是否一直都错了,为什么? (也许它有多糟糕?)

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

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

【问题讨论】:

  • 好吧,您的方法捕获未设置的变量,但它也会捕获已设置的其他变量。所以这并不是对正在设置的变量的真正测试
  • 嘿deceze!感谢昨天所做的一切——我对 PHP 的理解有了巨大的飞跃(如您所见)。我在搜索时没有看到那个,但我的想法基本上是一样的。
  • 我只想在上面链接的线程中重申我的一个 cmets:isset 有助于澄清您的代码并帮助调试:if (isset($var)) 表示“此变量是可选的,可能不存在” ,并且您的其余代码需要这样对待它。 if ($var) 仅表示“如果为真”。如果 PHP 对后者发出警告,您就知道您的代码在某处被搞砸了。出于这个原因,您总是需要在完全爆炸时使用错误报告进行编程。

标签: php if-statement


【解决方案1】:

如果未设置变量,您将获得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()

【讨论】:

    【解决方案2】:

    没问题,但使用if 检查设置变量不是一个好习惯。我想到了两个原因:

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

    【讨论】:

      【解决方案3】:

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

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

      取自 PHP 手册。

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

      【讨论】:

      • isset 检查变量是否存在已设置),而不是nullis set 部分比 not null 部分重要得多。
      • 感谢您的澄清。编辑以添加它。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        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 与根本没有设置一样好

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多