PHP 5.3中的枚举

Enums in PHP 5.3

本问题已经有最佳答案,请猛点这里访问。

在php 5.3之前,我使用以下自制函数创建枚举:

1
2
3
4
5
6
7
8
9
function enum()
{
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i)
    {
        if(defined($enum)) throw new Exception($enum.' is already defined.');
        else define($enum, $i);
    }

} // enum()

然后:

1
enum('CONST0', 'CONST1', 'CONST2', ...);

使用php 5.3,我可以使用const而不是define来从名称空间中获益。有没有方法可以修改这个函数使其使用const关键字?

另外,我只使用5.3来使代码看起来更干净,如果一定有性能影响(例如,使用eval或类似的东西),我将坚持好的旧定义。

我已经研究过这个问题:PHP和枚举,但是我没有找到我要找的。


我将尝试回答您的问题:是否有方法可以修改此函数以使其使用const关键字?

简短回答:否

长话短说:是的,你可以,但只能以一种非常尴尬的方式:

1
2
3
4
5
6
7
8
<?php
function enum() {
    for($enums = func_get_args(), $enum = reset($enums), $i = 1; $enum; $enum = next($enums), ++$i) {
        eval('const ' . $enum . ' = ' . $i . ';');
    }
}

enum('CONST0', 'CONST1', 'CONST2');

在http://3v4l.org/ontrn上测试


你不能有条件地使用const关键字[见这个投票率很高的答案]。

如果您想给常量命名,最好的方法是让它们成为类的静态字段,如果需要的话,可以利用magic __get__set

编辑:当然,在静态上下文中没有魔力设置器/getter,您无论如何都可以提供一个灵活的解决方案。