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

n00*_*00b 0 php exception

我正在尝试将一个功能组合在一起isset,is_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);
  }

}
Run Code Online (Sandbox Code Playgroud)

我在一个对象中使用它时遇到的问题是以下异常:

ErrorException [注意]:间接修改重载属性xxx无效.

irc*_*ell 5

为了方便使用?相当于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))... 替换整个通话.

但是如果你确实使用这种功能,我建议你改名.true即使变量不是null,它也会返回,因此调用该函数is_null是误导性的.也许is_empty会更好......