programing

상수의 이름을 얻는 방법은 무엇입니까?

magicmemo 2023. 8. 19. 10:05
반응형

상수의 이름을 얻는 방법은 무엇입니까?

클래스에 정의된 상수가 있다고 가정합니다.

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 "&lt;pre&gt;";

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

반응형