PHP에서 동적으로 선택된 클래스 상수 값을 가져옵니다.
나는 다음과 같은 일을 하고 싶다.
class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}
$thing = 'Something';
$id = ThingIDs::$thing;
이거 안 되네.이와 동등한 일을 할 수 있는 간단한 방법이 있을까요?참고로 나는 그 수업을 계속 들어야 해; 그것은 내가 다시 쓸 수 없는 도서관에 있어.명령줄에 인수를 사용하는 코드를 쓰고 있는데, ID 번호 대신 기호 이름을 사용했으면 합니다.
constant() 함수를 사용합니다.
$id = constant("ThingIDs::$thing");
리플렉션 사용
$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);
네임스페이스를 사용하는 경우 네임스페이스를 클래스에 포함해야 합니다.
echo constant('My\Application\ThingClass::ThingConstant');
도우미 기능
다음과 같은 기능을 사용할 수 있습니다.
function class_constant($class, $constant)
{
if ( ! is_string($class)) {
$class = get_class($class);
}
return constant($class . '::' . $constant);
}
여기에는 다음 두 가지 인수가 필요합니다.
- 클래스 이름 또는 개체 인스턴스
- 클래스 상수 이름
오브젝트 인스턴스가 전달되면 클래스 이름이 유추됩니다.PHP 7을 사용하는 경우::class네임스페이스를 고려하지 않고 적절한 클래스 이름을 전달할 수 있습니다.
예
class MyClass
{
const MY_CONSTANT = 'value';
}
class_constant('MyClass', 'MY_CONSTANT'); # 'value'
class_constant(MyClass::class, 'MY_CONSTANT'); # 'value' (PHP 7 only)
$myInstance = new MyClass;
class_constant($myInstance, 'MY_CONSTANT'); # 'value'
<?php
class Dude {
const TEST = 'howdy';
}
function symbol_to_value($symbol, $class){
$refl = new ReflectionClass($class);
$enum = $refl->getConstants();
return isset($enum[$symbol])?$enum[$symbol]:false;
}
// print 'howdy'
echo symbol_to_value('TEST', 'Dude');
클래스 자체에 대한 참조가 있는 경우 다음을 수행할 수 있습니다.
if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
// class constant is defined
}
나의 문제는 이 주제와 비슷했다.클래스 이름이 없는 오브젝트가 있는 경우 다음을 사용할 수 있습니다.
$class_name = get_class($class_object);
$class_const = 'My_Constant';
$constant_value = constant($class_name.'::'.$class_const);
조금 늦은 건 알지만 어쨌든 도움이 됐으면 좋겠어요.
필의 답변을 바탕으로 확장 가능한 기본 열거자 클래스를 만들었습니다.
class DefaultEnum
{
static public function getConstantText(string $constant)
{
try {
// Get child class name that called this method
$child_class = get_called_class();
$reflection = new ReflectionClass($child_class);
$const = $reflection->getConstant($constant);
return $const;
} catch (\ReflectionException $e) {
// ...
}
}
}
class CustomEnum extends DefaultEnum
{
const something = 'abcd';
const something2 = 'ABCD';
}
이 방법을 이렇게 부를 수 있습니다.
CustomEnum::getConstantText('something');
그것은 돌아올 것이다.'abcd'.
함수는 이 메서드를 호출한 클래스 이름을 반환하는 함수이며 정적 메서드에 대해서만 작동합니다.
이 경우$child_class가치가 있다CustomEnum::class. ReflectionClass는 문자열과 객체를 파라미터로 받아들입니다.
언급URL : https://stackoverflow.com/questions/6147102/get-value-of-dynamically-chosen-class-constant-in-php
'programing' 카테고리의 다른 글
| python을 사용하여 MD5의 합계를 얻는 방법 (0) | 2022.10.15 |
|---|---|
| Vuex에서 Axios 요청이 성공한 후 알림 표시 (0) | 2022.10.14 |
| 여러 쿼리에 대한 PDO 지원(PDO_MYSql, PDO_MYSqlND) (0) | 2022.10.14 |
| 이미지 뷰 Android에서 이미지 제거 (0) | 2022.10.14 |
| MySQL에서 기능할 때 MariaDB 오류 발생 (0) | 2022.10.14 |