这是一个 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
检查变量是否存在(已设置),而不是null
。 is 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 测试,看看是不是设置了变量的主要内容,如果未能解决你的问题,请参考以下文章
在Windows主机下安装的WordPress,设置成伪静态后网页中的图片无法显示,请问这是怎么回事?