일부 클래스에 여러 개의 CONST가 정의되어 있으며 해당 목록을 얻고 싶습니다. 예를 들면 다음과 같습니다.
class Profile {
const LABEL_FIRST_NAME = "First Name";
const LABEL_LAST_NAME = "Last Name";
const LABEL_COMPANY_NAME = "Company";
}
Profile
클래스에 정의 된 CONST 목록을 얻는 방법이 있습니까? 내가 알 수있는 한 가장 가까운 옵션 ( 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();
답변
ReflectionClass (PHP 5)를 사용할 수 있다면 PHP 문서 주석에 따라 :
function GetClassConstants($sClassName) {
$oClass = new ReflectionClass($sClassName);
return $oClass->getConstants();
}
답변
ReflectionClass를 사용하여 getConstants()
원하는 것을 정확하게 제공합니다.
<?php
class Cl {
const AAA = 1;
const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());
산출:
Array
(
[AAA] => 1
[BBB] => 2
)
답변
정적 방법으로 구조-구조
클래스 기능을 확장하기 위해 정적 함수와 함께 특성을 사용하기에 좋은 곳인 것 같습니다. 또한 특성을 통해 동일한 코드를 반복해서 다시 작성하지 않고도 다른 클래스에서이 기능을 구현할 수 있습니다 (DRY 유지).
프로파일 클래스에서 사용자 정의 ‘ConstantExport’특성을 사용하십시오. 이 기능이 필요한 모든 수업에 적용하십시오.
/**
* 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
)