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