Когда мне нужно передать перечисление в функцию 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 вызывает исключение, если вы все равно используете другой тип.
Также сглаживает процесс написания документации.
Поэтому я подумал, что это имеет много преимуществ, верно?
Но, возможно, письмо, поскольку у последнего есть другие преимущества или недостатки
Я не в курсе. Которые могут быть ими?
При создании нового 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
Других решений пока нет …