假設你在一個類中定義的常數:如何獲取常量的名稱?
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
$x = 6001;
// need to get 'ERR_SOME_CONST'
}
}
是否有可能用PHP?
假設你在一個類中定義的常數:如何獲取常量的名稱?
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
$x = 6001;
// need to get 'ERR_SOME_CONST'
}
}
是否有可能用PHP?
您可以用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:你介意告訴你爲什麼需要這個,因爲它看起來非常不尋常的...
與反思:
$class = new ReflectionClass("Foo");
$constants = $class->getConstants();
$constants
是一個數組它包含Foo類中定義的常量的所有名稱和值。
使用此函數可以將所有常量分配給一個數組。
$const = get_defined_constants();
然後使用下面的函數可以打印陣列結構
echo "<pre>";
print_r($const);
,你可以看到更多的解釋在這裏www.sugunan.com
這裏是我做了什麼來實現它。啓發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];
}
}
只是想說如果常數具有相同的值,這將不起作用。大部分時間不應該成爲問題,但是... – Populus 2014-06-24 20:20:06
我知道這是一個老問題,所有的,但我還是覺得我有一些有用的投入。我使用一個抽象類來實現它,所有的枚舉都可以擴展。抽象類包含一個通用的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>";
}
,如果你需要得到在同一類的方法的恆定值,你只需要使用自我操作員。你可以使用反射,如果你想使用另一個類上的常量
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
self::ERR_SOME_CONST;
}
}
警告:這種方式,你不應該編程...(如果你不確定youre做什麼:))
我寫了1排由你選擇的CATEGORY_
所以這裏回聲常數和它們的數值是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;
列表如果你只想要一個您所渴望的由數=>我創建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
所有其他的答案涵蓋的要點。但是,如果瘋狂的一個襯墊是你的事,那麼:
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);
}
這是簡單快捷的解決方案。翻轉陣列並檢查密鑰。 – 2016-04-12 08:15:13
好吧,好吧,我知道一切已經涵蓋:) 但JanHančič要求用例,所以我會分享我的。另外:大家似乎都使用array_flip()。爲什麼不是array_search()?
我需要它在一個擴展了\ Exception的類中,並且是我的一些小的具體異常的基類。每個具體的異常類都涵蓋了一個廣泛的異常域,並定義了幾個精確的異常原因。原因?我不想有一大堆例外來維護和記住。此外,還有一個異常處理程序集,它將異常的內容轉儲到日誌文件中 - 在這裏我需要獲取常量名稱,試圖從相當痛苦的狀態中解析異常原因。從我的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('Y-m-d H:i:s') .';'. $e->getName() .';'. $e->getMessage() .';'. $e->getFile() .';'. $e->getLine() ."\n", 3, 'error.log');
exit ($e->getCode());
});
沒什麼大不了,其實。只是想從類函數傳遞錯誤代碼的方式。至於我const ERR_SOME_ERROR ='ERR_SOME_ERROR'看起來很奇怪,我認爲我的getLastError()函數可能會返回類似數組(5003 =>'ERR_SOME_ERROR',5002 =>'ERR_SOME_ERR2')等等。 只是要返回錯誤代碼和錯誤名稱。那麼,我越想到它,我可能不會使用它(因爲你說的不尋常的語法):) – 2009-12-10 11:09:47
也需要它的CURLE_ *常量支持,其中'curl_multi_strerror'不可用 – 2013-10-03 08:36:16
我「需要」的東西像這樣,以便提供更好的錯誤輸出,而不必重寫如何跟蹤存儲爲常量的某些錯誤代碼。 – Frug 2015-04-21 14:30:11