PHP - функция проверки, которая возвращает true | false, и сообщение, если false - PullRequest
7 голосов
/ 23 апреля 2011

У меня есть функция проверки, которая возвращает либо 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. Сделал бы это сообщество вики

Ответы [ 4 ]

12 голосов
/ 23 апреля 2011

Вы на правильном пути, но я бы хотел сделать это следующим образом

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);
3 голосов
/ 04 марта 2013

Вы можете использовать объект 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);
1 голос
/ 23 апреля 2011
$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!';
0 голосов
/ 24 июля 2018

Я думаю, что предлагаемые здесь решения великолепны.Я просто хотел добавить свои два цента вместе с другим возможным решением.

На мой взгляд, предложенное вами решение работает довольно хорошо.Единственная проблема в том, что вы должны помнить , что $validation_result[0] это статус, а $validation_result[1] содержит сообщения.Это может быть хорошо с вами, но будет трудно поддерживать, если другие люди используют ваш код.По этой причине мне нравится решение Брэда Томаса о создании специализированного класса, который содержит сообщения и статус.Поскольку свойства названы, вам не нужно угадывать, как получить доступ к информации проверки.Кроме того, большинство хороших 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);
...