PHP:为空($ var),相当于!$ var

时间:2014-11-27 09:11:37

标签: php

为验证变量值,我们可以

if(empty($var)){
}

OR

这将在空字符串上返回true,0将作为number返回true,false,null

if(!$var){
}

这两种方法有什么区别,它们是等价的吗?

编辑:他们表现不同的一些例子会更加实际。

EDIT2 :根据答案建立的唯一区别是,如果$ var未定义,第二个将发出通知。他们返回的布尔值怎么样?

EDIT3 :对于$ var,我指的是任何值的变量,甚至是未定义的变量。

用户答案的​​结论if(!$var)empty($var)与此处http://php.net/manual/en/types.comparisons.php相同,它们将在同一个变量上返回相同的bool值。

如果未定义if(!$var)

$var将返回php通知,通常情况并非如此(如果我们编写好的代码),大多数IDE都会强调它。

  • 检查简单变量时if(!$var)应该没问题
  • 检查数组索引($ var [' key'])或对象属性($ var->键)时 empty($var['key'])最好使用空。

7 个答案:

答案 0 :(得分:5)

  

问题在于,因为!$ vars比空($ vars)短,我们很多人会更喜欢第一种方式

你更喜欢第一个,因为它是一个“短路”? 更短的代码并不意味着更好的代码或更快的脚本!

PHP函数及其各种其他行为的速度不取决于函数名的长度。它取决于PHP实际做什么来评估,操作和返回结果。

除此之外,不要选择基于代码长度的方法,选择基于场景的方法和最佳方法“用于给定场景”。
哪个最好取决于你需要什么,除了你提到的两个之外还有其他变量检查(isset()为一个)。

  

但问题是它们总是等同于

不,Stack,Google和php.net上还有很多其他答案 - 这是PHP手册! http://php.net/manual/en/types.comparisons.php

或者,您可以创建一个快速测试脚本,以查看PHP为您的两个方案返回的内容。

所有这些都是为什么我想知道为什么有6个赞成...

除此之外,您还可以在框架中初始化变量(或者,可能是独立脚本),这意味着场景会发生变化,您使用的问题和方法也会如此。

关于哪个是最好的,这都是背景。

至于所要求的答案。

无论如何,要回答你的问题,这里有一些测试:

<强> (!$vars)

示例代码:

if ( !$vars )
 {
  echo "TRUE";
 }
else
 {
  echo "FALSE";
 }

将返回:
注意:未定义的变量:vars in / whatever / on X行 是的

但是,如果首先在某个地方初始化脚本中的var:

$vars = "";
$vars = NULL;
$vars = 0;

以上任何一项都会返回:
[没有PHP通知]
是的

$vars = "anything";

将返回:
错误

这是因为使用感叹号测试var是否为FALSE,所以当没有用字符串初始化时,测试脚本返回TRUE,因为它不是FALSE。

当我们用字符串初始化它时,var NOT为FALSE为FALSE。

empty($vars)

示例代码:

if ( empty($vars) )
 {
  echo "TRUE";
 }
else
 {
  echo "FALSE";
}

根本没有初始化/设置,以及以下所有内容:

$vars = "";
$vars = NULL;
$vars = 0;

将返回:
是的

没有使用空的PHP通知,所以这里我们展示了两个选项之间的区别(并记得我说最短的代码不一定是“最好的”?取决于场景等)。

与之前的测试一样:

$vars = "anything";

返回:
错误

这与( !$var )相同,您正在测试IF EMPTY,并且根本没有初始化var,或者没有任何“empty()”值:例如(“”)或NULL,或者为零(0),然后测试var是否为空是TRUE,所以我们得到TRUE输出。

将var设置为字符串时会出现FALSE,因为IS EMPTY = FALSE,因为我们将其设置为某个值。


差异是empty()在未定义var时不会抛出PHP通知,而(!$var)则会抛出。

此外,您可能更喜欢将其作为“较短的代码”,但我认为if ( !$var )看起来很丑陋,并不像if ( empty($var) )那样简单易见。 但同样,这取决于场景 - PHP提供了不同的选项以满足不同的需求。

答案 1 :(得分:3)

不,他们不平等

if(empty($var)){
  echo "empty used\n";
}


if(!$var){ # line no. 6
  echo "! used";
}

将输出

empty used
Notice: Undefined variable: var in /var/www/html/test.php on line 6
! used

使用empty()函数

时,以下值被视为空
  • “”(空字符串)
  • 0(0为整数)
  • 0.0(0作为浮动)
  • “0”(0作为字符串)
  • NULL
  • FALSE
  • array()(空数组)
  • $变种; (声明的变量,但没有值)

正如您可以阅读empty文档

  

empty()基本上是!areset($ var)||的简洁等价物$ VAR   == false。

答案 2 :(得分:1)

主要区别在于如果变量不存在则empty()不会抱怨,而使用!会产生警告。

在旧版本的PHP中,empty()仅适用于直接变量,这意味着这将失败:

empty($a && $b);

这已在5.5

中更改

答案 3 :(得分:1)

他们不是。 第一个验证$ var是否有任何值。 第二个验证为布尔值 - 如果是或否。

第二个会给你一个通知,如果$ var的值为空,第一个将为真。

如果您想验证$ var是否存在,请使用isset。

if( !isset($var) )
    echo '$var does not exists!<br>';

if(empty($var))
    echo 'The value is empty or does not exists!<br>';

if( !$var )
    echo 'Value is false!<br>';

$var = '';
if(empty($var))
    echo 'The value is empty or does not exists!<br>';

使用此功能查看通知

error_reporting(-1);
ini_set('display_errors', 1);

答案 4 :(得分:1)

官方手册包含有关此主题的所有信息:

http://php.net/manual/en/types.comparisons.php

if (!$var)是最后一列,boolean : if($x) 否定

正如您所看到的那样, empty如果未设置变量,则不会抱怨。

从手册:

empty() does not generate a warning if the variable does not exist

花些时间研究那张图表。

答案 5 :(得分:1)

据我所知,这很简单。

empty()基本上等同于!isset($var) || !$var并且不会抛出任何警告/通知,而如果变量未定义则仅使用!$var将发出通知。

code and log output

为了完整起见,使用empty()

时,以下内容被视为空
  1. 空字符串
  2. 空数组
  3. 00.0'0'(int,float,string)
  4. null
  5. false
  6. 定义没有值的变量

答案 6 :(得分:0)

从布尔值返回空是等于!:

empty($var) === !$var; // supposed that $vars has been defined here

从通知/渐渐通知中,它们不等同于:

empty($array['somekey']); //will be silent if somekey does not exists
!$array['somekey']; // will through a warning if somekey does not exists