【问题标题】:PHP: is empty($var) equivalent to !$varPHP: 是空的($var) 等价于 !$var
【发布时间】:2014-11-27 09:11:37
【问题描述】:

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

if(empty($var)){
}

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

if(!$var){
}

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

编辑:一些表现不同的例子会更实用。

EDIT2:与答案的唯一区别是,如果 $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']) 最好使用空。

【问题讨论】:

  • @James 问题在于,由于 !$vars 比 empty($vars) 短,我们中的许多人会更喜欢第一种方式,但问题是它们总是等价的吗?
  • 大部分答案都回忆起文档(有点模棱两可),实际示例最好显示它们在哪些值上表现不同
  • 第二次编辑,see my comment
  • @James 好的我明白你的意思,但我只是想在这里有一个更好的想法,从其他开发人员的经验,也许你在 php 文档中找不到的东西,例如 $mysqli ->如果你不刷新查询,multi_query 将不会运行查询,而且这个东西不是写在 php 文档中的。
  • @KarolyHorvath 你的意思是你的有用评论吧?因为我的只是讽刺而不是侮辱,请您给出答案

标签: php


【解决方案1】:

问题在于,由于 !$vars 比 empty($vars) 短,我们中的许多人会更喜欢第一种方式

您更喜欢第一个,因为它是“更短的方式”?
更短的代码并不意味着更好的代码或更快的脚本;)

PHP 函数及其各种其他行为的速度不是由函数名称的长度决定的。它由 PHP 实际执行的评估、操作和返回结果决定。

除此之外,不要根据代码长度选择方法,而是根据场景和最佳方法“针对给定场景”选择方法。
哪个最好取决于您的需要,除了您提到的两个变量检查​​(isset() 一个)之外,还有其他变量检查。

但问题是它们总是等价的

不一定 - 请参阅 http://php.net/manual/en/types.comparisons.php

或者创建一个快速测试脚本来查看 PHP 为您的两个场景返回的内容。

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

关于哪个是最好的,这完全取决于上下文。

至于必答。

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

(!$vars)

示例代码:

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

将返回:
注意:未定义的变量:第 X 行 /whatever/ 中的 vars
真的

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

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

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

$vars = "anything";

将返回:
假的

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

当我们用一个字符串初始化它时,不为 FALSE 的 var 就是 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 提供了不同的选项来满足不同的需求。

【讨论】:

  • 你已经添加了一个很长的答案,你们中的一些假设或“建议”显然是,不需要说如何编写代码。这样的事情会很清楚:empty($var) === !$var 和 empty 不会引发和警告未定义的变量。
【解决方案2】:

不,它们不相等

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作为字符串)
  • 错误
  • array()(一个空数组)
  • $var; (声明的变量,但没有值)

正如您在empty docs 中看到的那样

empty() 本质上等同于 !isset($var) || $var == 错误。

【讨论】:

  • 另外,如果没有设置变量empty 为真,但!$var 是未定义变量!
  • 您在第二次测试中使用的是 $vars 而不是 $var
  • 如果$var ="0"empty 会返回true,但!isset($var) || $var == false 会返回false?`
【解决方案3】:

他们不是。 第一个验证 $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】:

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

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

    empty($a && $b);
    

    这已在 5.5 中更改

    【讨论】:

    • 这并没有给出问题的答案。
    • @fdomig:比你的好多了。
    【解决方案5】:

    官方手册包含了关于这个主题你必须知道的所有内容:

    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
    

    花点时间研究一下这张图表。

    【讨论】:

    • 该图表显示 empty 和 !$var 完全等同于布尔值返回
    • 它们是等价的。尽管我不确定“从布尔值返回”是什么意思。此页面还显示了不同之处,“注意:简单地在 $x 未定义时执行 if ($x) 将产生 E_NOTICE 级别的错误。相反,请考虑使用 empty() 或 isset() 和/或初始化您的变量。”。这一切都在文档中。
    • 我的意思是我不关心通知,我更关心$ret = !$vars。无论如何 $vars="0" as string 让我失望的是空返回 true,它是一个长度为 1 的字符串!
    • PHP 只是一堆糟糕的设计......这就是为什么这些页面如此有价值的原因。您应该从不使用empty 测试字符串是否为空。你真的应该关心通知,忽略它们是不好的做法(如果你的意思是它与你的具体问题无关,那么我理解 - 但从上下文中不清楚)。
    • 是的,通常我当然关心通知,我的意思是在这里的上下文中。
    【解决方案6】:

    据我所知,这很简单。

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

    为了完整起见,以下在使用empty()时被认为是空的:

    1. 空字符串
    2. 空数组
    3. 00.0'0'(整数、浮点数、字符串)
    4. null
    5. false
    6. 定义的变量没有值

    【讨论】:

    • 所以唯一的区别是空不会抛出通知,但它们返回相同的布尔值对吗?
    • if (empty($var)) echo 'empty'; if (!$var) echo 'empty'; 确实会执行两次echo 'empty';
    • 为了深入了解内部结构,如果 OR 语句中的任何内容返回 true,则不会检查其余部分。在empty() 中,如果未定义$var!isset($var) 将返回true,因此已经中断了语句。如果你只做 !$var 它不能检查 var 因为它没有定义。
    【解决方案7】:

    从布尔值返回空等于 !:

    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
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2021-08-04
      • 2014-03-08
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多