我有一个验证函数,它返回true
或false
但是,我希望它提供有关问题是什么的信息,如果有的话。
假设函数是这样的:
function is_valid($val) {
$result = true;
if( rule_1_not_met ) $result = false;
if( rule_2_not_met ) $result = false;
return $result;
}
使用哪个
$val = $_GET['some_param'];
if(!is_valid($val)) $out .= 'Not so helpful feedback.';
...
我以为我可以这样改变它:
function is_valid($val) {
$result = array(true, array());
if( rule_1_not_met ) $result[1][] = 'Reason 1';
if( rule_2_not_met ) $result[1][] = 'Reason 2';
if(count($result[1]) > 0) $result[0] = false;
return $result;
}
并像这样使用它:
$val = $_GET['some_param'];
$validation_result = is_valid($val);
if(!$validation_result[0]) $out .= implode('<br/>', $validation_result[1]);
...
我的问题是
P.S。将使这个社区维基
答案 0 :(得分:12)
你走在正确的轨道上,但我想以这种方式做到这一点
function is_valid($val,&$mes) {
$result = true;
if( rule_1_not_met ) { $mes[]='message one'; $result = false; }
if( rule_2_not_met ) { $mes[]='Message two'; $result = false; }
return $result;
}
$mes=array();
if(isvalid($val,$mes) ===false) $out .= implode('<br/>', $mes);
答案 1 :(得分:3)
您可以使用封装返回数据,消息和状态的Result对象。
即。
class Result( $bResult, $sMessage, $mData ) {
public function __construct() {
$this->bResult = $bResult;
$this->sMessage = $sMessage;
$this->mData = $mData;
}
}
在您的代码中:
$result = new Result(true, 'some helpful message here', null);
答案 2 :(得分:1)
$reasons = array();
function is_valid($val)
{
global $reasons;
if ( rule_1_not_met ) $reasons[] = 'Reason 1';
if ( rule_2_not_met ) $reasons[] = 'Reason 2';
if ( count($reasons) == 0 )
return TRUE;
else
return FALSE;
}
if (!is_valid($condition))
{
echo 'Was not valid for these reasons<br />';
foreach($reasons as $reason)
echo $reason, '<br>';
}
else
echo 'Is valid!';
答案 3 :(得分:0)
我认为这里建议的解决方案很棒。我只是想将我的两美分加上另一个可能的解决方案。
我认为,您提出的解决方案效果很好。唯一的问题是您必须记住,$validation_result[0]
是状态,$validation_result[1]
包含消息。这也许可以,但是如果其他人使用您的代码,则很难维护。因此,我喜欢Brad Thomas's solution创建一个包含消息和状态的专门类。由于属性已命名,因此您不必猜测如何访问验证信息。此外,大多数优质的IDE在您尝试访问其属性时都会自动完成。
我有一个替代解决方案。而不是包含布尔值true或false。只需返回消息数组即可。调用方只需检查返回的数组是否具有非零数量的错误。这是一个示例:
function get_errors($val) {
$errors = array();
if( rule_1_not_met ) $errors[] = 'Reason 1';
if( rule_2_not_met ) $errors[] = 'Reason 2';
return $errors;
}
然后,呼叫者将按以下方式使用它:
$val = $_GET['some_param'];
$validation_result = get_errors($val);
if (count($validation_result) > 0) $out .= implode('<br/>', $validation_result);