如何获得常数的名称?

时间:2009-12-10 10:45:51

标签: php class constants

假设你在一个类中定义了一个常量:

class Foo {
    const ERR_SOME_CONST = 6001;

    function bar() {
        $x = 6001;
        // need to get 'ERR_SOME_CONST'
    }
}

是否可以使用PHP?

9 个答案:

答案 0 :(得分:53)

您可以使用reflection API

获取它们

我假设您希望根据变量的值(变量的值==常量的值)获取常量的名称。获取类中定义的所有常量,循环它们并将这些常量的值与变量的值进行比较。 请注意,使用此方法,如果有两个具有相同值的常量,则可能会获得所需的其他常量。

示例:

class Foo {
    const ERR_SOME_CONST = 6001;
    const ERR_SOME_OTHER_CONST = 5001;

    function bar() {
        $x = 6001;
        $fooClass = new ReflectionClass ( 'Foo' );
        $constants = $fooClass->getConstants();

        $constName = null;
        foreach ( $constants as $name => $value )
        {
            if ( $value == $x )
            {
                $constName = $name;
                break;
            }
        }

        echo $constName;
    }
}

ps:你介意说你为什么需要这个,因为它看起来很不寻常......

答案 1 :(得分:26)

这是我为实现它所做的。受Jan Hancic的启发。

class ErrorCode
{
    const COMMENT_NEWCOMMENT_DISABLED = -4;
    const COMMENT_TIMEBETWEENPOST_ERROR = -3;
    /**
     * Get error message of a value. It's actually the constant's name
     * @param integer $value
     * 
     * @return string
     */
    public static function getErrorMessage($value)
    {
        $class = new ReflectionClass(__CLASS__);
        $constants = array_flip($class->getConstants());

        return $constants[$value];
    }
}

答案 2 :(得分:13)

反思:

$class = new ReflectionClass("Foo");
$constants = $class->getConstants();

$constants是一个数组,它包含类Foo中定义的常量的所有名称和值。

答案 3 :(得分:10)

我知道这是一个老问题,但我仍然觉得我有一些有用的输入。我使用我的所有枚举扩展的抽象类来实现它。抽象类包含一个通用的toString()方法;

abstract class BaseEnum{
    private final function __construct(){ }

    public static function toString($val){
        $tmp = new ReflectionClass(get_called_class());
        $a = $tmp->getConstants();
        $b = array_flip($a);

        return ucfirst(strtolower($b[$val]));
    }
}

//actual enum
final class UserType extends BaseEnum {
    const ADMIN = 10;
    const USER = 5;
    const VIEWER = 0;
}

通过这种方式,您可以在扩展基本枚举的每个枚举上获得用于输出的人类可读字符串。此外,您的枚举实现final无法扩展,因为BaseEnum中的构造函数是private,它永远无法实例化。

因此,例如,如果您显示所有用户名及其类型的列表,您可以执行类似

的操作
foreach($users as $user){
    echo "<li>{$user->name}, ".UserType::toString($user->usertype)."</li>";
}

答案 4 :(得分:8)

所有其他答案都涵盖了基本要点。但是,如果疯狂的一个衬垫是你的事,那么:

function getConstantName($class, $value)
{
    return array_flip((new \ReflectionClass($class))->getConstants())[$value];
}

如果你需要处理值可能实际上不是常量之一的情况,那么你可以放弃一个额外的行:

function getConstantName($class, $value)
{
    $map = array_flip((new \ReflectionClass($class))->getConstants());
    return (array_key_exists($value, $map) ? $map[$value] : null);
}

答案 5 :(得分:4)

可以使用此函数将所有常量赋值给数组。

$const = get_defined_constants();

然后使用以下函数可以打印数组结构

echo "&lt;pre&gt;";

print_r($const);

您可以在www.sugunan.com

看到更多解释

答案 6 :(得分:3)

警告:这样你就不应该编程......(如果你不确定你在做什么:))

我通过您选择的CATEGORY _

写了一行echos常量及其数值

所以这里是CATEGORY_ ERR _

的列表
foreach(get_defined_constants() as $key => $value) if(strlen($key)>5) if(substr($key, 0,5)=="ERR_") echo"<br>Found an php ERR_ constant! : ".$key."=>".$value;

如果你想要的是你想要的那个数字=&gt;我创建了1row函数:

//input parameters: CATEGORYNAME_ , #constantNumber
function getConstantName($category,$constantNumber){foreach(get_defined_constants() as $key => $value) if(strlen($key)>strlen($category)) if(substr($key, 0,strlen($category))==$category) if($value==$constantNumber) return $key; return "No constant found.";}

例如,一些信息常量为64:

echo "NameOfConstant: ".getConstantName("INFO_",64);

将输出类似:NameOfConstant: INFO_LICENSE

的内容

答案 7 :(得分:2)

好的,好的,我知道一切都已经涵盖了:) 但是JanHančič要求用例,所以我会分享我的。 旁白:每个人似乎都使用array_flip()。为什么不是array_search()?

我在扩展\ Exception的类中需要它,并且是我的具体异常的一小部分的基类。每个具体的异常类都涵盖了一个广泛的异常域,并定义了几个精确的异常原因。原因?我不希望有一大堆例外来维持和记住。此外,还有异常处理程序集将异常的内容转储到日志文件中 - 在这里我需要获取常量名称,因为尝试从状态中解析异常原因非常痛苦。

我的CLI脚本中的示例:

from matplotlib import mlab
import numpy as np

mean = 0
variance = np.linspace(0.5, 1, 3)
x = np.linspace(-3,3,100)

fig, ax = plt.subplots()
ax.set_frame_on(False)
for var in variance:
   ax.plot(x, mlab.normpdf(x,mean,np.sqrt(var)))

答案 8 :(得分:1)

如果你需要在同一个类的方法上获得常量值,你只需要使用self运算符。如果要在另一个类

上使用常量,可以使用反射
class Foo {
    const ERR_SOME_CONST = 6001;

    function bar() {
        self::ERR_SOME_CONST;
    }
}