当检查未定义的对象属性时,isset和is_null组合失败


Combining isset and is_null fails when checking undefined object property

我试图将issetis_null结合在一个功能中,以方便使用

我的方法:

class sys {
  public static function is_null(&$variable) {
    // if it's not set
    if (!isset($variable)) {
      return true;
    }
    // if array
    if (is_array($variable)) {
      return (boolean) (count($variable) < 1);
    }
    // if string
    return (boolean) (strlen($variable) < 1);
  }
}

当我在一个对象中使用它时,我遇到的问题是:

ErrorException [Notice]:间接修改重载属性xxx has no effect.

为了方便使用?相当于return !isset($var) || empty($var);。有那么难吗?

在构建这样的函数时需要意识到的是,isset()而不是一个函数。它是一种语言结构。因此,您不能将变量传递给函数,然后在该变量上调用isset(至少在不生成通知的情况下)。

其次,在:return (boolean) (strlen($variable) < 1);中没有必要强制转换为布尔值。这和return strlen($variable) < 1;完全一样。

第三,没有理由使用count()strlen(),因为这正是empty()设计用来检查的。

第四,根本没有理由通过引用传递实参。它不会改变任何东西,而且它会在没有理由的地方不必要地创建引用。就像普通的参数一样(由于写时复制,它不会使用更多的内存)。

总而言之,我建议不要使用这种"辅助"函数。如果你想检查它是否为空,只需使用!isset($var) || empty($var)。它更清晰,更有语义意义,坦率地说,它没有重复工作。如果你不关心通知,你可以用if (empty($variable))替换整个调用…

但是,如果您确实使用这种函数,我建议您更改名称。即使变量不是null,它也会返回true,因此调用函数is_null会产生误导。也许is_empty会更好…

直接用empty()