在回调中使用`isset()`时,避免在PHP中使用`Undefined Property`?

时间:2016-12-21 22:10:25

标签: php warnings trim isset

我为我的模型类编写了一个validation特征,以及一个错误报告库,它格式化并返回一个错误,警告等的JSON对象。

在我的validation特质中,我有这种方法......

function hasValue($value)
{
  return (isset($value) && !(trim($value) === ''));
}
如果我只是尝试在条件中使用!(trim($value)来告诉我变量未定义,那么PHP将会变暖。所以,你必须这样做......

if (isset($value) && !(trim($value) === ''))
  //Do Something

我创建了这个方法来整合一个非常常见的任务,需要将两个方法合并到一个方法中,但是我得到了同样的警告,就像我单独使用trim()方法一样。

有没有办法在不关闭警告的情况下这样做?

修改

似乎有些混乱。我需要这个来处理变量和对象属性。我试图改变这个......

if (empty($obj->email) && $this->validateEmail($obj->email))
  //Do Something

进入这个...

if ($this->validateEmail($obj->email))
  //Do Something

让我的hasValue()方法调用on,并在validateEmail()方法内。

2 个答案:

答案 0 :(得分:2)

您遇到的问题是,您的函数hasValue()将语句isset($value)!(trim($value) === '')评估为一个

相反,如果 !(trim($value) === '')等于 true ,则应评估isset($value) 。这是通过删除外括号来完成的。

function hasValue($value){
  return isset($value) && !(trim($value) === '');
  # if this ^^^^ is false this ^^^^ is never executed and no warning generated.
}

这会解决警告,但是hasValue()听起来更像是一个检查任何变量是否有值的函数,可能会这样做:

function hasValue($value){
  return isset($value) && !empty($value) || is_string($value) && !empty(trim($value));
}

var_dump(hasValue(null));  // false
var_dump(hasValue(true));  // true
var_dump(hasValue(false)); // false
var_dump(hasValue([]));    // false
var_dump(hasValue(''));    // false
var_dump(hasValue(' '));   // false
var_dump(hasValue('a'));   // true

interface validateInterface{
  public static function validateEmail($email);
  public static function validateEmailObj();
}

trait validateTrait{
  static function validateEmail($email){
    return filter_var($email, FILTER_VALIDATE_EMAIL); 
  }
  function validateEmailObj(){
    return filter_var($this->email, FILTER_VALIDATE_EMAIL); 
  }
}

# Implementing an interface is not required, but recommended as traits are easily overwritten.
class MyClass implements validateInterface{
  use validateTrait;

  public $email;

  function __construct($email){
    if(self::validateEmail($email)){
      echo 'works statically inside';
    }

    $this->email = $email;
  }
}

$mail = 'some@email.com';

if(MyClass::validateEmail($mail)){
  echo 'works statically outside class';
}

if((new MyClass($mail))->validateEmailObj()){
  echo 'works with objects';
}

对于较长的值列表,isset和empty的值为here

答案 1 :(得分:1)

这可能是使用@修饰符来抑制警告的合理位置。

if (@trim($value) != '')

如果$value未定义,则会将其转换为空字符串。发生这种情况时,使用@会禁止显示警告消息。