PHP - 验证函数返回true | false,如果为false则返回消息

时间:2011-04-23 15:26:26

标签: php function

我有一个验证函数,它返回truefalse 但是,我希望它提供有关问题是什么的信息,如果有的话。

假设函数是这样的:

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。将使这个社区维基

4 个答案:

答案 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);