如果您想返回类中定义的常量,您也可以定义一个内部方法,如下所示:
<?php
class myClass {
const NONE = 0;
const REQUEST = 100;
const AUTH = 101;
// 其他...
static function getConstants() {
$oClass = new ReflectionClass(__CLASS__);
return $oClass->getConstants();
}
}
?>
(PHP 5, PHP 7, PHP 8)
ReflectionClass::getConstants — 获取常量
filter
可选过滤器,用于过滤所需的常量可见性。它使用ReflectionClassConstant 常量进行配置,默认为所有常量可见性。
一个array类型的常量数组,其中键保存常量的名称,值保存常量的值。
版本 | 描述 |
---|---|
8.0.0 |
添加了filter 参数。 |
如果您想返回类中定义的常量,您也可以定义一个内部方法,如下所示:
<?php
class myClass {
const NONE = 0;
const REQUEST = 100;
const AUTH = 101;
// 其他...
static function getConstants() {
$oClass = new ReflectionClass(__CLASS__);
return $oClass->getConstants();
}
}
?>
您可以将$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'
如果您想定义一个可在继承中使用的静态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"
}
?>
我使用函数根据下面的类常量名称执行某些操作。此示例可能对每个人都有帮助。
<?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)){
//.....执行某些操作
}
}
?>
我试图确定如何获取接口中常量的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"
但是正如你所看到的,这在很多方面都能很好地发挥作用,所以我真的希望这能帮助其他人解决未来类似的难题!
享受!
获取最新声明的常量。
抽象类 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