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

Posted

技术标签:

【中文标题】这是一个 OK 测试,看看是不是设置了变量【英文标题】: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)

【问题讨论】:

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

    使用isset 可以明确意图 - 您正在检查变量是否已设置,而不是检查条件是否为真。 当 $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 与根本没有设置一样好

【讨论】:

以上是关于这是一个 OK 测试,看看是不是设置了变量的主要内容,如果未能解决你的问题,请参考以下文章

java 无法启动该应用程序,如何解决?

在Windows主机下安装的WordPress,设置成伪静态后网页中的图片无法显示,请问这是怎么回事?

在bash中取消设置变量检查

电脑开机停在Memory Testing :1048576 OK 怎么办 在线等

eclipse启动出错,环境变量设置正确

只会postman单接口测试?快看看这里