我为我的模型类编写了一个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()
方法内。
答案 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
未定义,则会将其转换为空字符串。发生这种情况时,使用@
会禁止显示警告消息。