2010-02-05 42 views
1

我有一个数据处理器级只能执行其主要功能,一旦它的所有成员变量已经被分配的值:检查对象为空成员变量的有效方法?

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。

回答

1

嗯,我将封装在像_isValid()保护法的检查,然后仅仅指刚做

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

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

另一件事,使塔实际工作检查更优雅是添加一个变量为_requiredValues,一个用于_values,并有它们都是数组 - 而不是使用单独的成员变量......这样,如果您愿意,可以使用数组比较函数批量检查它们。

如果想方便地访问到某个值,你可以只添加一个getter像'公共

function getValue($value) 
{ 
    return isset($this->_values[$value]) 
     ? $this->_values[$value] 
     : null; 
} 
+0

我实际上已经在一个单独的方法包装检查,只是省略,为简洁起见。我不反对使用数组存储所需值的想法,但我想先看看是否有其他建议。 –

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); 
}