programing

PHP 클래스에 정의된 CONST를 가져올 수 있습니까?

nicescript 2022. 12. 9. 22:11
반응형

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

반응형