PHP: как сделать так, чтобы аргумент мог принять только одно из определённых значений?

Предположим, что у нас есть

function some ($arg) {}

И логика такова, что в качестве значения $arg ожидается одно из следующих значений: "foo", "bar", "baz".

Самый простой вариант, который приходит в голову:

if ($arg != "foo" && $arg != "bar" && $arg != "baz") { ... }


Но насколько адекватным это решение является? Мне почему-то кажется, что должно существовать какое-то более грамотное решение.

Я знаю про существование такой вещи, как enum, но не знаю, стоит ли использовать его в данной ситуации? Если у нас двадцать подобных методов, то нужно будет сделать двадцать enum, и это лишь один класс. Не сделает ли это код слишком громоздким?
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Мне почему-то кажется, что должно существовать какое-то более грамотное решение.

Возможно, вот такое:
if(in_array($arg, ['foo', 'bar', 'baz'])) {
    // ...
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
такие значения в коде не проверяют. что-то где-то в глубине сравнивается вдруг со строками.
объявляйте константы и пляшите от них, как делают все библиотеки. и не забывайте кидать что-нибудь похожее на InvalidArgumentException.

<?php

const FOO = 'foo', BAR = 'bar', BAZ = 'baz';

class MyInvalidArgumentException extends \Exception { }

function foo($value) {
    switch ($value) {
        case FOO:
            echo FOO;
            break;
        case BAR:
            echo BAR;
            break;
        case BAZ:
            echo BAZ;
            break;
        default:
            throw new MyInvalidArgumentException();
    }
    return ;
}

foo(FOO);
foo(BAR);
foo(BAZ);
foo(null);
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Или такое:
if (preg_match('/^(?:foo|bar|baz)$/', $arg) {
  // ...
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы