变量存在且具有值,并且仅使用布尔值进行回复

时间:2018-01-18 17:14:54

标签: php

我在之前的帖子中搜索过并看过类似的讨论,但这个问题从未得到满意的回答。从本质上讲,我在PHP中寻找一种快速,优雅和简单的方法来提出问题'这是否存在,如果存在,它是否具有非零,非空值?&# 39; 在非对象"属性中发出通知场景或未定义的变量。

以下是我测试过的场景和几个版本:

// Setting up
$a = ['key' => 'value', 'otherKey' => 'otherValue', 'sub' => ['key' => 'value']];
$b = 0;
$c = 123;
$d = 'string';
$e = (object) $a;

// my tests:
!! $b 
=> false
!! $c
=> true
!! $a['key']
=> true
!! $a['notExist']
=> PHP Notice:  Trying to get property of non-object on line 1
!! $e->key
=> true
!! $e->notExist
=> PHP Notice:  Trying to get property of non-object on line 1
!! $f
=> PHP Notice:  Trying to get property of undefined variable on line 1

我用isset(),empty()和各种各样的东西做了同样的事情。我设法通过构建一个检查类型,遍历名称空间的函数来构建一个有点可行的版本,并尝试做各种各样的伏都教到你投掷它的论点上,但感觉它不应该那么复杂。

真的没有更好的方式来询问"这是否存在并且是否设置为非零,非空值?"

2 个答案:

答案 0 :(得分:2)

您仍然可以使用empty。正如文档所述:

  

确定变量是否为空。如果变量不存在或者其值等于FALSE,则该变量被视为空。如果变量不存在,empty()不会生成警告。

然后我们可以检查PHP converts values to booleans

的方式
  

转换为布尔值时,以下值被视为FALSE:
   - 布尔值FALSE本身
   - 整数0(零)
   - 浮点数0.0(零)
   - 空字符串,字符串" 0"
   - 零元素的数组
   - 特殊类型NULL(包括未设置变量)
   - 从空标签创建的SimpleXML对象
  每个其他值都被视为TRUE(包括任何资源和NAN)。

所以,即使任何级别都不存在,你应该只对!empty有好处,例如:

!empty($foo)
!empty($foo->bar->num1)
!empty($foo['bar']['num1'])

以上都不会显示警告。

现在,谈到功能,我们无法真正使用empty来检查它的存在。为此,我们需要更加具体:function_exists或类似的内容,例如method_exists

答案 1 :(得分:0)

一般来说,我去的是

if ( isset( $var) && $var !== 0 )
{
    // condition met
}

如果未设置该值,则简写AND运算符将结束,如果已设置,则它将检查NULL值。速记检查应防止未设置变量的错误。