【问题标题】:PHP - Validation function to return true|false, AND a message if falsePHP - 返回 true|false 的验证函数,如果为 false,则返回一条消息
【发布时间】:2018-07-24 09:04:13
【问题描述】:

我有一个验证函数,它返回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]);
...

我的问题是

  • 我会因为这个意外的结果而参与进来​​吗?
  • 有没有更好的方法来实现这一点?

附:将使这个社区维基

【问题讨论】:

  • 看不到创建此社区 wiki 的链接。这是怎么做到的?
  • 您可以标记它以引起版主注意并写一个简短的说明。但 imo 这不是社区 wiki 问题。
  • @Felix Kling:我这么说是因为可能很难不接受多个答案。不过会等着看会发生什么。
  • 没有理由这需要是 cwiki

标签: php function


【解决方案1】:

你在正确的轨道上,但我想这样做

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

【讨论】:

  • 这有利于通过多次调用is_valid 逐步构建消息,这可能会有所帮助。
  • 谢谢,这有助于调试。
【解决方案2】:

您可以使用封装返回数据、消息和状态的 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);

【讨论】:

  • 我喜欢你在这里的建议......但我在野外并不经常看到这个,@Framework 的建议是我习惯看到的,我什至找不到使用这种方法的文章或示例...我今天只是 Googletard 吗?还是有其他人在使用您的方法?
  • 嗨@CamdenS。我猜这是一个相当定制的解决方案 - 我受到一位前同事的启发,他会使用这种结构移动数据。
【解决方案3】:
$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!';

【讨论】:

    【解决方案4】:

    我认为这里建议的解决方案很棒。我只是想加上我的两分钱以及另一种可能的解决方案。

    在我看来,您提出的解决方案效果很好。唯一的问题是您必须记住 $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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2018-03-23
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      相关资源
      最近更新 更多