У меня есть несколько 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"
В комментариях к документам 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::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());
Почему бы не поместить их в переменную класса в качестве массива для начала? Делает это легче, чтобы петли через.
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());
Похоже, это приятное место для использования черт со статическим методом для расширения функциональности класса. Черты также позволят нам реализовать эту функциональность в любом другом классе, не переписывая один и тот же код снова и снова (оставайтесь DRY).
Используйте наш пользовательский «ConstantExport» Trait в классе Profile. Сделайте это для каждого класса, в котором вам нужны эта функциональность.
/** * 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 )