我为我的模型类编写了一个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/