函数参数中的枚举

时间:2015-02-13 09:50:26

标签: php function parameters enums

当我需要在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会抛出异常。 它也使文档编写过程顺利进行。

所以我认为这有很多优点吗?

  

但也许写作后者有其他优点或缺点   我不知道。哪个可能是他们?

1 个答案:

答案 0 :(得分:1)

创建新的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