当我需要在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 :(得分: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