Могу ли я получить CONST, определенный в классе PHP?
У меня есть несколько 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')
Ответы
Ответ 1
Вы можете использовать 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
)
Ответ 2
Это
$reflector = new ReflectionClass('Status');
var_dump($reflector->getConstants());
Ответ 3
Используйте 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"
Ответ 4
В PHP5 вы можете использовать Reflection: (ручная ссылка)
$class = new ReflectionClass('Profile');
$consts = $class->getConstants();
Ответ 5
В комментариях к документам PHP, если вы можете использовать ReflectionClass (PHP 5):
function GetClassConstants($sClassName) {
$oClass = new ReflectionClass($sClassName);
return $oClass->getConstants();
}
Источник находится здесь.
Ответ 6
Использование ReflectionClass и getConstants()
дает именно то, что вы хотите:
<?php
class Cl {
const AAA = 1;
const BBB = 2;
}
$r = new ReflectionClass('Cl');
print_r($r->getConstants());
Вывод:
Array
(
[AAA] => 1
[BBB] => 2
)
Ответ 7
Да, вы используете reflection. Посмотрите на вывод
<?
Reflection::export(new ReflectionClass('YourClass'));
?>
Это должно дать вам представление о том, что вы будете смотреть.
Ответ 8
Удобно иметь метод внутри класса для возврата своих собственных констант.
Вы можете сделать так:
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());
Ответ 9
Почему бы не поместить их в переменную класса в качестве массива для начала? Делает это легче, чтобы петли через.
private $_data = array("production"=>0 ...);
Ответ 10
В конце концов с пространствами имен:
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());
Ответ 11
Признак со статическим методом - на помощь
Похоже, что это приятное место для использования Traits со статическим методом для расширения функциональности класса. Черты также позволят нам реализовать эту функциональность в любом другом классе, не переписывая один и тот же код снова и снова (оставайтесь 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
)