我可以在 PHP 类上定义 CONST 吗?

我在一些类上定义了几个 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')
74484 次浏览

您可以使用 反射进行此操作。请注意,如果您经常这样做,那么您可能需要查看缓存结果。

<?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'
)

是的,你使用 反思。看看输出

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

这应该能让你知道你会看到什么。

在 PHP5中可以使用反射: (手动参考)

$class = new ReflectionClass('Profile');
$consts = $class->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"

使用 RefectionClass 和 getConstants()可以得到您想要的结果:

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

产出:

Array
(
[AAA] => 1
[BBB] => 2
)

根据 PHP 文档的注释,如果您能够使用 RefectionClass (PHP5) :

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

源头在这里。

为什么不把它们作为一个数组放在一个类变量中开始呢。

private $_data = array("production"=>0 ...);

这个

 $reflector = new ReflectionClass('Status');
var_dump($reflector->getConstants());

最终使用名称空间:

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 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());

特质用静态的方法-去拯救

看起来这是一个使用 Traits 和一个静态函数来扩展类功能的好地方。Traits 还允许我们在任何其他类中实现这个功能,而无需一遍又一遍地重写相同的代码(保持 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
)
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_());