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

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

function some ($arg) {}

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

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

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


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

Я знаю про существование такой вещи, как enum, но не знаю, стоит ли использовать его в данной ситуации? Если у нас двадцать подобных методов, то нужно будет сделать двадцать enum, и это лишь один класс. Не сделает ли это код слишком громоздким?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 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) {
  // ...
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Алгоритмика Москва
от 110 000 до 160 000 руб.
N1.RU Новосибирск
от 100 000 руб.
Living Core Казань
от 50 000 руб.
15 сент. 2019, в 12:45
50000 руб./за проект
15 сент. 2019, в 10:50
45000 руб./за проект
15 сент. 2019, в 10:47
4000 руб./за проект