如果您想返回类中定义的常量,您可以定义一个内部方法,如下所示:
<?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>
interface 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 all constants
*
* @return array
*/
静态函数 getConstants()
{
$rc = new \ReflectionClass(get_called_class());
return $rc->getConstants();
}
/**
* 返回调用类中定义的最后一个常量数组 || Return last constants
*
* @return array
*/
静态函数 lastConstants()
{
$parentConstants = static::getParentConstants();
$allConstants = static::getConstants();
return array_diff($allConstants, $parentConstants);
}
/**
* 返回所有父类的常量 || Return parent constants
*
* @return array
*/
静态函数 getParentConstants()
{
$rc = new \ReflectionClass(get_parent_class(static::class));
$consts = $rc->getConstants();
return $consts;
}
}
======
类 Roles 扩展 AbstractEnum
{
常量 ROOT = 'root';
常量 ADMIN = 'admin';
常量 USER = 'user';
}
// 输出
全部: root, admin, user
最后: root, admin, user
类 NewRoles 扩展 Roles
{
常量 CLIENT = 'client';
常量 MODERATOR = 'moderator';
常量 SUPERMODERATOR = 'super'.self::USER;
}
// 输出
全部: client, moderator, superuser, root, admin, user
最后: client, moderator, superuser
类 AdditionalRoles 扩展 Roles
{
常量 VIEWER = 'viewer';
常量 CHECKER = 'checker';
常量 ROOT = 'rooter';
}
全部: viewer, checker, rooter, client, moderator, superuser, admin, user
最后: viewer, checker, rooter