перечисления в параметрах функции

Когда мне нужно передать перечисление в функцию php, мне нравится:

public function my_function (MyEnum $second) {

switch ($second->get_value()) {
case MyEnum::foo:
....
}
....
}

class MyEnum {
const foo = 0;
const bar = 1;

private $value;

public function __construct ($value) {
$this->value = $value;
}

public function get_value () { return $this->value; }
}

и звоните как:

my_function(new MyEnum(MyEnum::foo));

Должен ли я изменить свою функцию, чтобы написать my_function(MyEnum::foo); ?

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

Поэтому я подумал, что это имеет много преимуществ, верно?

Но, возможно, письмо, поскольку у последнего есть другие преимущества или недостатки
Я не в курсе. Которые могут быть ими?

0

Решение

При создании нового MyEnum вот так

my_function(new MyEnum(MyEnum::foo));

Ваша IDE по-прежнему не сможет уловить проблему, возникающую, когда вы передаете несуществующее значение в конструктор:

my_function(new MyEnum(12345));

Хотя IDE не волнует, ваш код может быть не таким счастливым.

Вы можете сохранить завершение кода IDE, предупреждения и повысить безопасность, внедрив перечисления в виде иерархии классов:

abstract class MyEnum
{
const foo = 1;
const bar = 2;

protected $value;

public function get_value()
{
return $this->value;
}
}

class Foo extends MyEnum { protected $value = MyEnum::foo; }
class Bar extends MyEnum { protected $value = MyEnum::bar; }

function my_function (MyEnum $second)
{
switch ($second->get_value()) {
case MyEnum::foo:
return 'foo';
break;
case MyEnum::bar:
return 'bar';
break;
default:
// This won't happen
break;
}
}

echo my_function(new Foo), PHP_EOL;
echo my_function(new Bar), PHP_EOL;

Выход:

foo
bar
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]