2009-12-10 54 views

回答

48

您可以用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

沒什麼大不了,其實。只是想從類函數傳遞錯誤代碼的方式。至於我const ERR_SOME_ERROR ='ERR_SOME_ERROR'看起來很奇怪,我認爲我的getLastError()函數可能會返回類似數組(5003 =>'ERR_SOME_ERROR',5002 =>'ERR_SOME_ERR2')等等。 只是要返回錯誤代碼和錯誤名稱。那麼,我越想到它,我可能不會使用它(因爲你說的不尋常的語法):) – 2009-12-10 11:09:47

+0

也需要它的CURLE_ *常量支持,其中'curl_multi_strerror'不可用 – 2013-10-03 08:36:16

+2

我「需要」的東西像這樣,以便提供更好的錯誤輸出,而不必重寫如何跟蹤存儲爲常量的某些錯誤代碼。 – Frug 2015-04-21 14:30:11

12

與反思:

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

$constants是一個數組它包含Foo類中定義的常量的所有名稱和值。

1

使用此函數可以將所有常量分配給一個數組。

$const = get_defined_constants(); 

然後使用下面的函數可以打印陣列結構

echo "<pre>"; 

print_r($const); 

,你可以看到更多的解釋在這裏www.sugunan.com

20

這裏是我做了什麼來實現它。啓發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]; 
    } 
} 
+3

只是想說如果常數具有相同的值,這將不起作用。大部分時間不應該成爲問題,但是... – Populus 2014-06-24 20:20:06

7

我知道這是一個老問題,所有的,但我還是覺得我有一些有用的投入。我使用一個抽象類來實現它,所有的枚舉都可以擴展。抽象類包含一個通用的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>"; 
} 
2

,如果你需要得到在同一類的方法的恆定值,你只需要使用自我操作員。你可以使用反射,如果你想使用另一個類上的常量

class Foo { 
    const ERR_SOME_CONST = 6001; 

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

警告:這種方式,你不應該編程...(如果你不確定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

5

所有其他的答案涵蓋的要點。但是,如果瘋狂的一個襯墊是你的事,那麼:

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

這是簡單快捷的解決方案。翻轉陣列並檢查密鑰。 – 2016-04-12 08:15:13

2

好吧,好吧,我知道一切已經涵蓋:) 但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()); 
});