[php] CONST를 PHP 클래스에서 정의 할 수 있습니까?

일부 클래스에 여러 개의 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
)