Php 非空变量的简化测试

Php 非空变量的简化测试,php,Php,我正在维护一些旧的PHP代码,我发现代码中有很多地方测试了以下形式的非空变量: if(!(isset($field\u name)&strlen($field\u name)>0)) 按照我的想法,以下简单得多的形式会做完全相同的事情: if ($field_name) 我是否遗漏了一个更复杂的形式更精确的子片段?我倾向于在任何需要添加新代码的地方使用更简单的表单。它们做的事情不同。第一个代码示例: 检查$field\u name是否存在(我认为!是无意的,因为它的编写方式没有意义) 检查$f

我正在维护一些旧的PHP代码,我发现代码中有很多地方测试了以下形式的非空变量:

if(!(isset($field\u name)&strlen($field\u name)>0))

按照我的想法,以下简单得多的形式会做完全相同的事情:

if ($field_name)
我是否遗漏了一个更复杂的形式更精确的子片段?我倾向于在任何需要添加新代码的地方使用更简单的表单。

它们做的事情不同。第一个代码示例:

  • 检查
    $field\u name
    是否存在(我认为
    是无意的,因为它的编写方式没有意义)
  • 检查
    $field\u name
    的字符串长度是否大于零
  • 第二个代码示例:

  • 检查变量是否具有布尔值
    true
  • 如果未设置
    $field\u name
    ,将引发错误
  • 第一个代码片段的意图清晰而准确,并执行特定的任务

    第二个代码段非常基本,只验证变量是否具有布尔真值(还有更好的方法)。如果
    $field\u name
    包含字符串“0”,此代码段将导致难以发现的错误,因为它将失败,因为“0”的计算结果为false。第一个代码段将捕捉到这一点。

    如果$field为null、0、0.00、false或任何可以转换为false的内容,if($field)将失败

    如果(!isset($field))

    如果未声明$field,则将失败。您可以使用
    empty()
    替换第一行:

    if (!empty($field_name))
    
    第二个示例的问题是,如果未设置变量,它将生成警告。
    empty()
    isset()
    都不会为不存在的变量生成警告


    请注意,您必须始终考虑可能的值,因此如果您的值可以是
    0
    '0'
    ,这将不会像
    $var=0之后那样工作
    empty($var)
    将计算为
    true

    您发现的代码是奇数,这是正确的。它可能是:

    if(!(isset($field_name)) { ... do something }
    

    …正如您所理解的,不需要测试未定义变量的长度

    然而,
    if($field\u name)
    if(!(isset($field\u name))
    不一样,差别并不微妙。事实上,如果运气不好,
    $field\u name
    没有定义,前者将为您赢得一个
    未定义变量:fieldname

    有什么区别?

  • if($field\u name)
    测试现有变量
    $field\u name
    。例如,它的值可能是“my dog”,其计算结果为
    TRUE
  • if(!(isset($field\u name))
    测试变量
    $field\u name
    是否存在

  • 您应该检查PHP中的。它们是布尔值false、整数0、浮点值0.0、空字符串、字符串“0”,一个包含零元素的数组,空标记创建的null和SimpleXML对象。我忽略了指定0或其他falsy值在我们的系统中是非法的。因此我没有明确说明意图。我的感觉是答案中有价值,我可能会接受其中一个作为“答案”.我认为上面的第一行,无论其精度如何,都过于复杂。部分原因是它是一个复合条件,其中一个条件被否定。
    if(isset($field_name) && strlen($field_name) > 0 )  { ... do something }