如何获取常量的名称?

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

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

用PHP可以吗?

你可以用reflectionAPI来获取它们

我假设你想根据你的variables的值(variables的值==常量值)获取常量的名称。 获取在类中定义的所有常量,遍历它们并将这些常量的值与variables的值进行比较。 请注意,使用这种方法,如果存在两个具有相同值的常量,则可能会得到一个您需要的常量。

例:

 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:你介意告诉你为什么需要这个,因为这看起来很不寻常…

这是我做到的。 启发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]; } } 

用反思:

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

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

我知道这是一个古老的问题,但我仍然觉得我有一些有用的意见。 我用一个抽象类来实现这个function,所有的枚举types都被扩展了。 抽象类包含一个通用的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; } 

这样你就可以得到一个可读的string在输出中使用,每个扩展基本枚举的枚举。 而且,你的enum实现是final ,不能被扩展,因为BaseEnum的构造BaseEnumprivate ,所以永远不能被实例化。

所以举例来说,如果你显示所有用户名和他们的types列表,你可以做类似的事情

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

所有其他的答案涵盖的要点。 但是,如果疯狂的一件衬衫是你的事情,那么:

 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); } 

警告:这种方式你不应该编程…(如果你不知道你在做什么:))

我写了1行回声常数和他们的数值由您selectCATEGORY_

所以这里是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; 

如果你只想要一个你正在寻找的号码=>我创build了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

如果您需要在同一个类的方法上获得常量值,则只需使用自运算符。 如果你想在另一个类上使用常量,你可以使用reflection

 class Foo { const ERR_SOME_CONST = 6001; function bar() { self::ERR_SOME_CONST; } } 

好的,好的,我知道所有的东西都已经被覆盖了:)但是JanHančič提出了用例,所以我会分享我的。 旁白:每个人似乎都使用array_flip()。 为什么不array_search()?

我需要它在一个扩展\ Exception的类中,并且是我的一些具体的exception的小集合的基类。 每个具体的exception类都涵盖了广泛的exception域,并定义了几个精确的exception原因。 原因? 我不想有一大堆例外来维护和记住。 此外,还有一个exception处理程序集,它将exception的内容转储到日志文件中 – 在这里,我需要获取常量名称,试图从exception状态中parsingexception原因。

来自我的CLI脚本的示例:

 class AbstractException extends Exception { public function getName() { return array_search($this->getCode(), (new ReflectionClass($this))->getConstants()); } } class SyntaxException extends AbstractException { const BAD_SYNTAX = 90; const REQUIRED_PARAM = 91; const REQUIRED_VALUE = 92; const VALUE_TYPE = 93; const VALUE_OUT_OF_BOUNDS = 94; public function __construct ($message = "", $code = self::BAD_SYNTAX, Exception $previous = NULL) { $script = basename($GLOBALS['argv'][0]); echo "Invalid syntax: $message \nSee: `$script --help` for more information\n"; parent::__construct($message, $code, $previous); } } // in autoload include set_exception_handler(function(Exception $e) { error_log(basename($GLOBALS['argv'][0]) . ';'. date('Ymd H:i:s') .';'. $e->getName() .';'. $e->getMessage() .';'. $e->getFile() .';'. $e->getLine() ."\n", 3, 'error.log'); exit ($e->getCode()); }); 

所有的常量都可以使用这个函数分配给一个数组。

 $const = get_defined_constants(); 

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

 echo "&lt;pre&gt;"; print_r($const); 

你可以在www.sugunan.com看到更多的解释