检查对象是否为空成员变量的有效方法?

时间:2010-02-05 17:00:21

标签: php architecture oop

我有一个数据处理器类,只有在为其所有成员变量赋值后才能执行其主要功能:

class {
    public $firstName;
    public $lastName;
    public $ssn;
    public $accessKey;

    public function __construct($data = null) {
        if (is_array($data)) {
            // Assign the value of any fields in $data to
            // the corresponding member var
        }
    }

    public processData() {
        // *** CHECK IF ALL PROPERTIES HAVE VALUES ***
        foreach ($this as $p=>$val) {
            if ($val === null) {
                return false;
            }
        }

        doStuff();
    }
}

是否有更有效或更优雅的方法来验证所有属性都有值?用这种方式感觉有点PHugly。

2 个答案:

答案 0 :(得分:1)

我会将检查封装在受保护的方法中,如_isValid(),然后jsut do

public function process()
{
  if($this->_isValid())
  {
     $this->doStuff();
     return true;
  }

  // otherewise throw an exception or otherwise alter control flow return values
}

另一个让执行检查更优雅的方法是为_requiredValues添加一个变量,为_values添加一个变量,让它们都是数组 - 而不是使用单个成员变量......这样如果您愿意,可以使用数组比较功能批量检查它们。

如果您想轻松访问各个值,您可以添加一个像`public

这样的getter
function getValue($value) 
{ 
    return isset($this->_values[$value]) 
       ? $this->_values[$value] 
       : null; 
}

答案 1 :(得分:1)

您可以将类成员放入一个数组中,这样您就可以迭代它们而不包括所有其他类成员,例如:

<?php

class Test
{

    public $options = array
    (
        'firstname' => NULL,
        'lastname' => NULL,
        'ssn' => NULL,
        'accesskey' => NULL,
    );

    public function __set($key, $val)
    {
        if (empty($val) === FALSE AND array_key_exists($key, $this->options))
        {
            $this->options[$key] = $val;
        }
        else
        {
           // Throw an exception
           throw new Exception('Empty value');
        }

        return;
    }

    public processData()
    {
        doStuff();
    }            
}

您的代码出错,您忘记了“processData”上的“函数”语法。

我还创建了一个__set方法,当你设置一个空值时会抛出一个错误。例如

<?php

$test = new Test;

try
{
    // Throws an error
    $test->firstname = NULL;
} 
catch(Exception $e)
{ 
   var_dump($e);
}

try
{
    // Works fine
    $test->firstname = 'Brian';
} 
catch(Exception $e)
{ 
   var_dump($e);
}