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

alb*_*anx 7 php

为了验证变量值,我们可以做

if(empty($var)){
}
Run Code Online (Sandbox Code Playgroud)

要么

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

if(!$var){
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑2:从答案中找出的唯一区别是,如果$ var未定义,则第二个将发出通知.他们返回的布尔值怎么样?

EDIT3:对于$ var,我的意思是任何带有任何值的变量,甚至是未定义的变量.

从用户的答案结论: if(!$var)empty($var)如这里所描述相当于http://php.net/manual/en/types.comparisons.php,他们将回到同一变量相同的布尔值.

if(!$var)如果$var没有定义,将返回一个php通知,通常不是这种情况(如果我们编写好的代码),大多数IDE都会强调它.

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

Jam*_*mes 5

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

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

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

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

但问题是它们总是相同的

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

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

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

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

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

至于要求的答案.

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

(!$vars)

示例代码:

if ( !$vars )
 {
  echo "TRUE";
 }
else
 {
  echo "FALSE";
 }
Run Code Online (Sandbox Code Playgroud)

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

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

$vars = "";
$vars = NULL;
$vars = 0;
Run Code Online (Sandbox Code Playgroud)

以上任何一项都将返回:
[没有PHP通知]
TRUE

$vars = "anything";
Run Code Online (Sandbox Code Playgroud)

将返回:
FALSE

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

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

empty($vars)

示例代码:

if ( empty($vars) )
 {
  echo "TRUE";
 }
else
 {
  echo "FALSE";
}
Run Code Online (Sandbox Code Playgroud)

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

$vars = "";
$vars = NULL;
$vars = 0;
Run Code Online (Sandbox Code Playgroud)

将返回:
TRUE

没有PHP通知使用空,所以这里我们显示两个选项之间的差异(并记得我说最短的代码不一定是"最好的"?取决于场景等).

和之前的测试一样:

$vars = "anything";
Run Code Online (Sandbox Code Playgroud)

返回:
FALSE

这是相同的( !$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提供了不同的选项以满足不同的需求.


alb*_*anx 0

从布尔值返回空相当于!:

empty($var) === !$var; // supposed that $vars has been defined here
Run Code Online (Sandbox Code Playgroud)

从通知/衰弱通知来看,它们并不等同:

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