153

一部のクラスでいくつかの CONST が定義されており、それらのリストを取得したいと考えています。例えば:

class Profile {
    const LABEL_FIRST_NAME = "First Name";
    const LABEL_LAST_NAME = "Last Name";
    const LABEL_COMPANY_NAME = "Company";
}

Profileクラスで定義された CONST のリストを取得する方法はありますか? 私が知る限り、最も近い option( 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')
4

12 に答える 12

272

これにはリフレクションを使用できます。これを頻繁に行っている場合は、結果のキャッシュを検討することをお勧めします。

<?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'
)
于 2009-06-05T15:15:11.040 に答える
23

これ

 $reflector = new ReflectionClass('Status');
 var_dump($reflector->getConstants());
于 2010-10-15T22:59:58.877 に答える
17

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"
于 2009-06-05T15:21:07.020 に答える
15

PHP5 では、リフレクションを使用できます: (マニュアル参照)

$class = new ReflectionClass('Profile');
$consts = $class->getConstants();
于 2009-06-05T15:15:40.650 に答える
13

PHPのドキュメントのコメントによると、ReflectionClass(PHP 5)を使用できる場合は、次のようになります。

function GetClassConstants($sClassName) {
    $oClass = new ReflectionClass($sClassName);
    return $oClass->getConstants();
}

ソースはこちらです。

于 2010-10-06T18:43:21.640 に答える
9

ReflectionClass を使用すると、getConstants()必要なものが正確に得られます。

<?php
class Cl {
    const AAA = 1;
    const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());

出力:

Array
(
    [AAA] => 1
    [BBB] => 2
)
于 2009-12-09T09:54:49.317 に答える
7

クラス内に独自の定数を返すメソッドがあると便利です。
次の方法で実行できます。

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());
于 2014-09-18T12:48:22.117 に答える
5

ええ、リフレクションを使用します。の出力を見てください

<?
Reflection::export(new ReflectionClass('YourClass'));
?>

それはあなたが何を見ているのかという考えをあなたに与えるはずです.

于 2009-06-05T15:15:39.637 に答える
3

そもそも配列としてクラス変数に入れてみませんか?ループスルーが簡単になります。

private $_data = array("production"=>0 ...);
于 2010-10-06T18:46:50.227 に答える
3

最終的に名前空間で:

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());
于 2012-10-15T07:48:45.267 に答える
1
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_());
于 2018-11-04T15:40:39.117 に答える