PHP 클래스에 정의된 CONST를 가져올 수 있습니까?
일부 클래스에서 정의된 여러 개의 CONST를 가지고 있는데, 그 목록을 가져오고 싶습니다.예를 들어 다음과 같습니다.
class Profile {
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
}
에 정의되어 있는 CONST 목록을 얻을 수 있는 방법이 있습니까?Profile
수업이요? 제가 알기로는 가장 가까운 선택지입니다.get_defined_constants()
)는 기능하지 않습니다.
내가 실제로 필요한 것은 지속적인 이름 목록입니다. 다음과 같습니다.
array('LABEL_FIRST_NAME',
'LABEL_LAST_NAME',
'LABEL_COMPANY_NAME')
또는 다음 중 하나를 선택합니다.
array('Profile::LABEL_FIRST_NAME',
'Profile::LABEL_LAST_NAME',
'Profile::LABEL_COMPANY_NAME')
또는 다음과 같은 경우도 있습니다.
array('Profile::LABEL_FIRST_NAME'=>'First Name',
'Profile::LABEL_LAST_NAME'=>'Last Name',
'Profile::LABEL_COMPANY_NAME'=>'Company')
여기에는 Reflection을 사용할 수 있습니다.이 작업을 많이 수행하는 경우 결과를 캐싱하는 것이 좋습니다.
<?php
class Profile {
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
}
$refl = new ReflectionClass('Profile');
print_r($refl->getConstants());
출력:
Array
(
'LABEL_FIRST_NAME' => 'First Name',
'LABEL_LAST_NAME' => 'Last Name',
'LABEL_COMPANY_NAME' => 'Company'
)
$reflector = new ReflectionClass('Status');
var_dump($reflector->getConstants());
token_get_all()을 사용합니다.즉,
<?php
header('Content-Type: text/plain');
$file = file_get_contents('Profile.php');
$tokens = token_get_all($file);
$const = false;
$name = '';
$constants = array();
foreach ($tokens as $token) {
if (is_array($token)) {
if ($token[0] != T_WHITESPACE) {
if ($token[0] == T_CONST && $token[1] == 'const') {
$const = true;
$name = '';
} else if ($token[0] == T_STRING && $const) {
$const = false;
$name = $token[1];
} else if ($token[0] == T_CONSTANT_ENCAPSED_STRING && $name) {
$constants[$name] = $token[1];
$name = '';
}
}
} else if ($token != '=') {
$const = false;
$name = '';
}
}
foreach ($constants as $constant => $value) {
echo "$constant = $value\n";
}
?>
출력:
LABEL_FIRST_NAME = "First Name"
LABEL_LAST_NAME = "Last Name"
LABEL_COMPANY_NAME = "Company"
PHP5에서는 Reflection:(수동 참조)을 사용할 수 있습니다.
$class = new ReflectionClass('Profile');
$consts = $class->getConstants();
PHP 문서 설명에 따르면 ReflectionClass(PHP 5)를 사용할 수 있는 경우:
function GetClassConstants($sClassName) {
$oClass = new ReflectionClass($sClassName);
return $oClass->getConstants();
}
Reflection Class를 사용하여 원하는 것을 제공합니다.
<?php
class Cl {
const AAA = 1;
const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());
출력:
Array
(
[AAA] => 1
[BBB] => 2
)
정적 방법을 사용한 특성 - 구조
정적 기능이 있는 특성을 사용하여 클래스 기능을 확장하기에 좋은 장소인 것 같습니다.또, 이 기능을 다른 클래스에서도 실장할 수 있기 때문에, 같은 코드를 몇번이나 고쳐 쓰지 않아도 됩니다(DRY 상태를 유지합니다).
프로파일 클래스에서 커스텀 'Constant Export' 특성을 사용합니다.이 기능이 필요한 모든 클래스에 대해 이 작업을 수행합니다.
/**
* ConstantExport Trait implements getConstants() method which allows
* to return class constant as an assosiative array
*/
Trait ConstantExport
{
/**
* @return [const_name => 'value', ...]
*/
static function getConstants(){
$refl = new \ReflectionClass(__CLASS__);
return $refl->getConstants();
}
}
Class Profile
{
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
use ConstantExport;
}
사용 예
// So simple and so clean
$constList = Profile::getConstants();
print_r($constList); // TEST
출력:
Array
(
[LABEL_FIRST_NAME] => First Name
[LABEL_LAST_NAME] => Last Name
[LABEL_COMPANY_NAME] => Company
)
클래스 내부에 자체 상수를 반환하는 메서드가 있으면 편리합니다.
다음과 같이 할 수 있습니다.
class Profile {
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
public static function getAllConsts() {
return (new ReflectionClass(get_class()))->getConstants();
}
}
// test
print_r(Profile::getAllConsts());
응, 반사를 해.의 출력을 봐 주세요.
<?
Reflection::export(new ReflectionClass('YourClass'));
?>
그럼 앞으로 뭘 보게 될지 알 수 있을 거야
우선 이들을 클래스 변수에 배열로 배치하는 것이 어떨까요?루프가 쉬워집니다.
private $_data = array("production"=>0 ...);
최종적으로는 네임스페이스:
namespaces enums;
class enumCountries
{
const CountryAustria = 1 ;
const CountrySweden = 24;
const CountryUnitedKingdom = 25;
}
namespace Helpers;
class Helpers
{
static function getCountries()
{
$c = new \ReflectionClass('\enums\enumCountries');
return $c->getConstants();
}
}
print_r(\Helpers\Helpers::getCountries());
class Qwerty
{
const __COOKIE_LANG_NAME__ = "zxc";
const __UPDATE_COOKIE__ = 30000;
// [1]
public function getConstants_(){
return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__,
'__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__];
}
// [2]
static function getConstantsStatic_(){
return ['__COOKIE_LANG_NAME__' => self::__COOKIE_LANG_NAME__,
'__UPDATE_COOKIE__' => self::__UPDATE_COOKIE__];
}
}
// [1]
$objC = new Qwerty();
var_dump($objC->getConstants_());
// [2]
var_dump(Qwerty::getConstantsStatic_());
언급URL : https://stackoverflow.com/questions/956401/can-i-get-consts-defined-on-a-php-class
'programing' 카테고리의 다른 글
MySQL 쿼리에서 정규식을 수행하는 방법 (0) | 2022.12.29 |
---|---|
왜 이렇게 인쇄가 느리죠?더 빨리 할 수 있나요? (0) | 2022.12.29 |
최종적으로 블록에 예외를 발생시킵니다. (0) | 2022.12.09 |
$(this)와 this(this)의 차이점은 무엇입니까? (0) | 2022.12.09 |
Linux(Mageia)의 NetBeans에서 Java 애플리케이션에서 MariaDB에 연결 (0) | 2022.12.09 |