상수의 이름을 얻는 방법은 무엇입니까?
클래스에 정의된 상수가 있다고 가정합니다.
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
$x = 6001;
// need to get 'ERR_SOME_CONST'
}
}
PHP로 가능합니까?
당신은 반사 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 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에 정의된 상수의 모든 이름과 값을 저장하는 배열입니다.
다른 모든 답변은 핵심 사항을 다룹니다.하지만, 만약 미친 라이너 하나가 당신의 것이라면, 다음과 같습니다.
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);
}
저는 이것이 오래된 질문이라는 것을 알지만, 여전히 제가 유용한 의견을 가지고 있다고 느낍니다.저는 제 모든 열거형이 확장되는 추상 클래스를 사용하여 이것을 구현했습니다.추상 클래스에 일반 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>";
}
이 함수를 사용하여 모든 상수를 배열에 할당할 수 있습니다.
$const = get_defined_constants();
그런 다음 다음 다음 기능을 사용하여 배열 구조를 인쇄할 수 있습니다.
echo "<pre>";
print_r($const);
그리고 당신은 여기에서 더 많은 설명을 볼 수 있습니다. www.sugunan.com
경고:이런 식으로 프로그래밍하면 안 됩니다...(만약 당신이 무엇을 하고 있는지 확신할 수 없다면 :)
당신이 선택한 카테고리_에 따라 상수와 숫자 값을 에코하는 행을 1개 작성했습니다.
여기 카테고리_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;
그리고 번호별로 찾으시는 것만 원하신다면 => 1행 함수를 만들었습니다:
//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
좋아요, 좋아요, 저는 이미 모든 것이 커버되고 있다는 것을 알고 있어요 :) 하지만 얀 한치치가 사용 사례를 요청했으니 제 것을 공유하겠습니다.별도: 모두가 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());
});
class OrderStatus
{
public const PENDING = 1;
public const PROCESSED = 2;
public static function getStatusCode($value)
{
$class = new ReflectionClass(__CLASS__);
$constants = array_flip($class->getConstants());
return $constants[$value] ?? null;
}
// OrderStatus::getStatusCode(1); // 'PENDING'
}
같은 클래스의 메서드에서 상수 값을 얻어야 하는 경우 자체 연산자를 사용하면 됩니다.다른 클래스에서 상수를 사용하려면 반사를 사용할 수 있습니다.
class Foo {
const ERR_SOME_CONST = 6001;
function bar() {
self::ERR_SOME_CONST;
}
}
언급URL : https://stackoverflow.com/questions/1880148/how-to-get-name-of-the-constant
'programing' 카테고리의 다른 글
꺼내기 요청 중 분기 이름 변경 (0) | 2023.08.19 |
---|---|
Excel에서 형식을 지정하지 않고 .csv를 강제로 엽니다. (0) | 2023.08.19 |
파워셸에서 N개의 병렬 작업 실행 (0) | 2023.08.19 |
Oracle에서 볼 수 있는 문자열의 실제 길이 (0) | 2023.08.14 |
단순 PowerShell 마지막 쓰기 시간 비교 (0) | 2023.08.14 |