我可以在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') 

你可以使用reflection这个。 请注意,如果你正在做这么多,你可能想要caching结果。

 <?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" 

根据PHP文档注释,如果您能够使用ReflectionClass(PHP 5):

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

来源在这里。

在PHP5中,您可以使用reflection:( 手动引用)

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

是的,你用reflection 。 看看输出

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

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

在类中有一个方法返回自己的常量是很方便的。
你可以这样做:

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

为什么不把它们作为一个数组放在一个类variables中? 使循环更容易。

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

用静态特征的特征 – 来拯救

看起来像使用Traits和静态方法扩展类function是一个很好的地方。 特性还可以让我们在任何其他类中实现这个function,而不会一遍又一遍地重写相同的代码(保持干燥)。

在Profile类中使用我们自定义的“ConstantExport”Trait。 为每个需要此function的课程做好准备。

 /** * 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 )