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

时间:2009-06-05 15:12:09

标签: php constants class-constants

我在某些类上定义了几个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')

12 个答案:

答案 0 :(得分:221)

您可以使用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'
)

答案 1 :(得分:21)

This

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

答案 2 :(得分:15)

使用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"

答案 3 :(得分:13)

在PHP5中,您可以使用Reflection:(manual reference)

$class = new ReflectionClass('Profile');
$consts = $class->getConstants();

答案 4 :(得分:13)

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

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

Source is here.

答案 5 :(得分:8)

使用ReflectionClass和getConstants()可以准确地给出您想要的内容:

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

输出:

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

答案 6 :(得分:5)

是的,你使用reflection。看看

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

这应该让你知道你将要看什么。

答案 7 :(得分:4)

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

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

答案 8 :(得分:4)

使用静态方法进行特质训练

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

在Profile类中使用我们的自定义'ConstantExport'Titit。为您需要此功能的每个班级执行此操作。

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

答案 9 :(得分:3)

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

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

答案 10 :(得分:3)

最终使用名称空间:

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 :(得分:1)

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