상수의 이름을 포함하는 단순 변수를 사용하여 클래스 상수에 액세스
다음 중 하나의 클래스에서 클래스 상수에 액세스하려고 합니다.
const MY_CONST = "value";
이 상수의 이름을 다음과 같이 유지하는 변수가 있는 경우:
$myVar = "MY_CONST";
MY_CONST의 가치에 접근할 수 있습니까?
self::$myVar
는 정적 속성용이기 때문에 동작하지 않습니다.변수도 작동하지 않습니다.
여기에는 상수 함수를 사용하는 방법과 반사를 사용하는 두 가지 방법이 있습니다.
상수 함수
상수 함수는 다음을 통해 선언된 상수와 함께 작동합니다.define
클래스 상수:
class A
{
const MY_CONST = 'myval';
static function test()
{
$c = 'MY_CONST';
return constant('self::'. $c);
}
}
echo A::test(); // output: myval
리플렉션클래스
두 번째, 더 힘든 방법은 성찰하는 것입니다.
$ref = new ReflectionClass('A');
$constName = 'MY_CONST';
echo $ref->getConstant($constName); // output: myval
구문은 없지만 명시적 룩업을 사용할 수 있습니다.
print constant("classname::$myConst");
또, 이 동작은,self::
.
MY_CONST의 가치에 접근할 수 있습니까?
self::MY_CONST
에 동적으로 액세스하는 경우 reflection API를 사용할 수 있습니다.
$myvar = 'MY_CONST';
$class = new ReflectionClass(self);
$const = $class->getConstant($myVar);
리플렉션 API의 장점은 모든 상수를 한 번에 얻을 수 있다는 것입니다(getConstants
).
만약 당신이 리플렉션 API를 사용하기 싫어서 싫어한다면, 다른 방법은constant
기능(데모):
$myvar = 'MY_CONST';
class foo {const MY_CONST = 'bar';}
define('self', 'foo');
echo constant(self.'::'.$myvar);
해보셨습니까
$myVar = MY_CONST or $myVar = $MY_CONST
Reflection에 대한 참고 사항: ReflectionClass 생성자는 해당 파라미터에 대한 클래스의 전체 경로를 수신해야 합니다.즉, 문자열 'A'를 생성자 매개 변수로 설정하는 것만으로는 작동하지 않을 수 있습니다.
이 문제를 피하려면 ReflectionClass를 사용할 때 다음과 같이 하면 좋습니다.
$classA = new A();
$name_classA = get_class($classA);
$ref = new ReflectionClass(get_class($name_classA));
$constName = 'MY_CONST';
echo $ref->getConstant($constName);
get_class 함수는 사용자가 코드에 있을 때마다 클래스의 전체 경로를 제공합니다.전체 경로를 놓치면 "Class not found" PHP 오류가 발생할 수 있습니다.
언급URL : https://stackoverflow.com/questions/7506530/accessing-a-class-constant-using-a-simple-variable-which-contains-the-name-of-th
'programing' 카테고리의 다른 글
여러 상속을 가진 부모 클래스 __init__를 호출하는 올바른 방법은 무엇입니까? (0) | 2022.09.25 |
---|---|
SQL Chemy는 Django의 get_or_create와 동등한 기능을 가지고 있습니까? (0) | 2022.09.25 |
SQL을 사용하여 유사한 선택 항목의 값을 집계하고 합산하는 방법은 무엇입니까? (0) | 2022.09.25 |
여러 컨스트럭터를 구현하기 위한 깨끗한 "피토닉" 방법은 무엇입니까? (0) | 2022.09.25 |
데이터베이스, 테이블, 열 대조 간의 차이 (0) | 2022.09.25 |