我有一个数据处理器类,只有在为其所有成员变量赋值后才能执行其主要功能:
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。
答案 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
这样的getterfunction 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);
}