PHP Conference Japan 2024

ReflectionClass::getConstants

(PHP 5, PHP 7, PHP 8)

ReflectionClass::getConstants获取常量

描述

public ReflectionClass::getConstants(?int $filter = null): array

获取类中定义的所有常量,无论其可见性如何。

参数

filter

可选过滤器,用于过滤所需的常量可见性。它使用ReflectionClassConstant 常量进行配置,默认为所有常量可见性。

返回值

一个array类型的常量数组,其中键保存常量的名称,值保存常量的值。

变更日志

版本 描述
8.0.0 添加了filter参数。

参见

添加备注

用户贡献的笔记 6条笔记

davide dot renzi at gmail dot com
10年前
如果您想返回类中定义的常量,您也可以定义一个内部方法,如下所示:

<?php
class myClass {
const
NONE = 0;
const
REQUEST = 100;
const
AUTH = 101;

// 其他...

static function getConstants() {
$oClass = new ReflectionClass(__CLASS__);
return
$oClass->getConstants();
}
}
?>
Sandor Toth
8年前
您可以将$this作为类传递给ReflectionClass。如果您扩展了原始类,__CLASS__将无济于事,因为它是一个基于文件本身的魔术常量。

<?php

class Example {
const
TYPE_A = 1;
const
TYPE_B = 'hello';

public function
getConstants()
{
$reflectionClass = new ReflectionClass($this);
return
$reflectionClass->getConstants();
}
}

$example = new Example();
var_dump($example->getConstants());

// 结果:
array ( size = 2)
'TYPE_A' => int 1
'TYPE_B' => (string) 'hello'
Panni
6年前
如果您想定义一个可在继承中使用的静态getConstants()函数,您可以执行以下操作:

<?php

abstract class AbstractClass
{
const
TEST = "test";

public static function
getConstants()
{
// 此处的 "static::class" 起了关键作用
$reflectionClass = new ReflectionClass(static::class);
return
$reflectionClass->getConstants();
}
}

class
ChildClass extends AbstractClass
{
const
TYPE_A = 1;
const
TYPE_B = 'hello';
}

$example = new ChildClass();
var_dump($example->getConstants());

// 结果:
array(3) {
'TYPE_A' => int(1)
'TYPE_B' => string(5) "hello"
'TEST'
=> string(4) "test"
}

?>
shgninc at gmail dot com
11年前
我使用函数根据下面的类常量名称执行某些操作。此示例可能对每个人都有帮助。
<?php
public function renderData($question_type = NULL, $data = array()) {
$types = array();
$qt = new ReflectionClass(questionType);
$types = $qt->getConstants();
if (
$type = array_search($question_type, $types)){
//.....执行某些操作
}
}
?>
djhob1972 at yahoo dot com dot au
14年前
我试图确定如何获取接口中常量的var_dump。没错,不使用任何类,而是接口本身。

在我的探索过程中,我发现ReflectionClass结合直接对接口的调用也会转储其常量,这太棒了!

这是使用PHP 5.3.1,我的示例如下所示:

第一个文件

constants.php

<?php
<?php>

接口
MyConstants
{
// --------------------------
// 程序级别
// --------------------------
const DEBUG_MODE_ACTIVE = FALSE;
const
PHP_VERSION_REQUIREMENT = "5.1.2";
}
?>

=======
第二个文件
=======

test.php

<?php>
include_once ("constants.php");

$oClass = new ReflectionClass ('MyConstants');
$array = $oClass->getConstants ();
var_dump ($array);
unset ($oClass);
?>

命令行输出:

?:\???\htdocs\????>php test.php
array(2) {
["DEBUG_MODE_ACTIVE"]=> bool(false)
["PHP_VERSION_REQUIREMENT"]=> string(5) "5.1.2"

但是正如你所看到的,这在很多方面都能很好地发挥作用,所以我真的希望这能帮助其他人解决未来类似的难题!

享受!
dmitrochenkooleg at gmail dot com
5年前
获取最新声明的常量。

抽象类 AbstractEnum
{
/**
* 返回所有常量
*
* @return array
*/
静态函数 getConstants()
{
$rc = new \ReflectionClass(get_called_class());

return $rc->getConstants();
}

/**
* 返回在调用类中定义的最新常量
*
* @return array
*/
静态函数 lastConstants()
{
$parentConstants = static::getParentConstants();

$allConstants = static::getConstants();

return array_diff($allConstants, $parentConstants);
}

/**
* 返回所有父类常量
*
* @return array
*/
静态函数 getParentConstants()
{
$rc = new \ReflectionClass(get_parent_class(static::class));
$consts = $rc->getConstants();

return $consts;
}
}

======
类 Roles 扩展 AbstractEnum
{
const ROOT = 'root';
const ADMIN = 'admin';
const USER = 'user';
}

// 输出
全部:root, admin, user
最新:root, admin, user

类 NewRoles 扩展 Roles
{
const CLIENT = 'client';
const MODERATOR = 'moderator';
const SUPERMODERATOR = 'super'.self::USER;
}

// 输出
全部:client, moderator, superuser, root, admin, user
最新:client, moderator, superuser

类 AdditionalRoles 扩展 Roles
{
const VIEWER = 'viewer';
const CHECKER = 'checker';
const ROOT = 'rooter';
}

全部:viewer, checker, rooter, client, moderator, superuser, admin, user
最新:viewer, checker, rooter
To Top