检查某个对象的某些属性是否为null的干净方法


Clean way to check if some of an objects properties are null

我有一个结构

class foo{
    public $a;
    public $b;
    public $c;
}

这是由一个用AJAX发送的经过解析的javascript对象填充的。在我将结构存储在数据库中之前,我想验证某些键是否为null,以防有人绕过前端验证。我知道我能做

function validate($someFoo)
{
    if (!$someFoo->a) {
        return false;
    }
    if (!$someFoo->b) {
        return false;
    }
    return true;
}

但有没有一种更干净的方法可以做到这一点(事实上,我正在检查大约10个字段,所以这是10个if语句)。

您可以使用get_object_vars来获取对象属性的数组。

function validate($someFoo) {
    foreach (get_object_vars($someFoo) as $var) {
        if ($var === null) {
            return false;
        }
    }
    return true;
}

这是一种非常干净的检查空类字段的方法。我看不出有什么理由把它简化得更多。只需分别检查每个字段。

使用这种技术,您可以很容易地添加其他可能导致Foo实例无效的情况——例如,您可能有一些其他函数createConnection(...),它可能会使Foo实例无效。您可以添加一个错误(addError)并检查isValid

您可以通过添加其他集合(如Warnings或Notices)以及这些集合的更多访问器函数来对此进行扩展。

<?php
class Foo {
    private $a;
    private $b;
    private $c;
    private $errors = array();
    public function __construct($a, $b, $c) {
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
        if ($this->a === null) {
            $this->addError("A is null");
        }
        if ($this->b === null) {
            $this->addError("B is null");
        }
        if ($this->c === null) {
            $this->addError("C is null");
        }
    }
    protected function addError($error) {
        $this->errors[] = $error;
    }
    public function isValid() {
        $isValid = count($this->errors) == 0;
        return $isValid;
    }
}
$foo = new Foo("TestA", "TestB", null);
if( $foo->isValid() ) {
    echo "Foo is valid";
}
else {
    echo "Foo is not valid";
}

您可以使用get_object_vars()来实现您的目标。

class foo {
    public $a;
    public $b;
    public $c;
}
function validate($someFoo)
{
    $classVars = get_object_vars($someFoo);
    foreach($classVars as $cv) {
        if(null === $cv) return false;
    }
    return true;
}
$myFoo = new foo();
var_dump(validate($myFoo));

如果$myFoo变量中至少有一个为NULL,则上面的代码将返回false。