Принудительно указывать в качестве строкового параметра в php - PullRequest
0 голосов
/ 16 сентября 2018

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

У меня есть метод, который создается для отображения текста с заданной строкой и типом ошибки:

public function output($string, $errorType) : void
{
    echo "<div class='alert alert-$errorType' role='alert'>$string</div>";
}

Поскольку я использую бутстрап, этот $errorType всегда должен быть предупреждением, опасностью или успехом. Но так как это строка, я могу дать $errorType совершенно другое значение. Я хочу принудительно использовать три типа ошибок: предупреждение, опасность или успех. Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Вы можете разрешить пользователям указывать int как $errorType. Например, 0 для предупреждения, 1 для опасности, 2 для успеха. Для других значений вы можете либо установить значение по умолчанию (например, предупреждение), либо вы можете вернуть исключение.

public function output($string, $errorType)
    {
       $type = "";

       if($errorType == 0)
          $type = "warning";

       else if($errorType == 1)
          $type = "danger";

       else if($errorType == 2)
          $type = "success";

       else
       {
         // You can set a default error type here, if input is incorrect
         // Or you can simply return an exception to inform user about limitations.
       }


        echo "<div class='alert alert-$type' role='alert'>$string</div>";
    }
0 голосов
/ 16 сентября 2018

Этот вопрос относится к проверке ввода.

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

Наиболее интуитивный подход заключается в том, чтобы поместить его прямо в методНапример,

if (!in_array($input, self::ACCEPTABLE_INPUT)) {
  throw some exception
}

Альтернативным механизмом в том же духе было бы использование assert:

assert(in_array($input, self::ACCEPTABLE_INPUT));

Однако это предполагает достойное тестовое покрытие.

Один способ, которыйЯ обычно предпочитаю моделировать тип ошибки как объект значения, например.

final class ErrorType
{
    private const ACCEPTED = ['warning', 'danger', 'success'];
    private $type;
    public function __construct(string $type)
    {
        if (!in_array($type, ErrorType::ACCEPTED) {
             throw some exception
        }
        $this->type = $type;
    }

    public function __toString(): string
    {
        return $this->type;
    }
}

Это немного больше кода, но позволяет вам следовать принципу единой ответственности.

ВашФункция будет выглядеть так:

public function output($string, ErrorType $errorType) : void
{
    echo "<div class='alert alert-$errorType' role='alert'>$string</div>";
}
0 голосов
/ 16 сентября 2018

Выдает исключение , если входное значение $errorType не является допустимым значением. Вы можете сделать что-то вроде как ниже:

public function output($string, $errorType) : void
{
    // define all possible valid input values for $errorType
    $accepted_error_type = array('warning', 'danger', 'success');

    // throw exception if invalid input
    if (!in_array($errorType, $accepted_error_type) {
        throw new Exception('Invalid errorType in function output. Expected: warning, danger or success. Received: ' . $errorType);
    }

    // Rest of the implementation details come here
    echo "<div class='alert alert-$errorType' role='alert'>$string</div>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...