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

标签 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() 方法在 validateEmail() 方法内部调用意愿。

最佳答案

您遇到的问题是您的函数 hasValue() 计算语句 isset($value)!(trim($value) = == '') 作为

相反,您应该评估 !(trim($value) === '') if 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 = '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5b2834363e1b3e363a323775383436" rel="noreferrer noopener nofollow">[email protected]</a>';

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

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

对于更长的值列表,isset 和empty 可以看到 here

关于php - 在回调中使用 `Undefined Property` 时,避免 PHP 中的 `isset()` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272760/

相关文章:

php - 如何重建 Symfony Encore Assets ?

php - 如果内容发生变化,自动刷新 JS 数组?

objective-c - 关于 "Semantic Issue"的编译器警告——如何解决?

c++ - 为什么内置类型和类在不使用时会受到不同对待?

sql-server - SQL Server : RTRIM not working to remove empty spaces

c++ - 我写了一个函数来删除句子中的空格,但它只在空格前取字符而不考虑整个句子

php - 如何使用 date_add 将年、月、日、小时、分钟、秒添加到 mysql 日期?

php - 使用 Yii 样板设置公共(public) HTML 文件夹的正确方法是什么?

c - 签名不同 - 警告

如果文本为 0,JavaScript 隐藏 DIV 标签