在 PHP 中获取动态选择的类常量的值

我希望能够做这样的事情:

class ThingIDs
{
const Something = 1;
const AnotherThing = 2;
}


$thing = 'Something';
$id = ThingIDs::$thing;

这不管用。有没有一种简单易行的方法来做相同的事情?注意,我被这个类困住了; 它在一个无法重写的库中。我编写的代码在命令行中使用参数,我希望 真的使用符号名,而不是 id 号。

36421 次浏览

使用反射

$r = new ReflectionClass('ThingIDs');
$id = $r->getConstant($thing);

使用 常数()函数:

$id = constant("ThingIDs::$thing");
<?php


class Dude {
const TEST = 'howdy';
}


function symbol_to_value($symbol, $class){
$refl = new ReflectionClass($class);
$enum = $refl->getConstants();
return isset($enum[$symbol])?$enum[$symbol]:false;
}


// print 'howdy'
echo symbol_to_value('TEST', 'Dude');

如果使用命名空间,则应将该命名空间包括在类中。

echo constant('My\Application\ThingClass::ThingConstant');

如果你有一个对类本身的引用,那么你可以这样做:

if (defined(get_class($course). '::COURSES_PER_INSTANCE')) {
// class constant is defined
}

辅助功能

您可以使用如下函数:

function class_constant($class, $constant)
{
if ( ! is_string($class)) {
$class = get_class($class);
}


return constant($class . '::' . $constant);
}

这需要两个理由:

  • 类名或对象实例
  • 类常量名称

如果传递了对象实例,则推断其类名。如果使用 PHP7,则可以使用 ::class传递适当的类名,而不必考虑名称空间。

例子

class MyClass
{
const MY_CONSTANT = 'value';
}


class_constant('MyClass', 'MY_CONSTANT'); # 'value'
class_constant(MyClass::class, 'MY_CONSTANT'); # 'value' (PHP 7 only)


$myInstance = new MyClass;
class_constant($myInstance, 'MY_CONSTANT'); # 'value'

我的问题与这个主题类似。当你有对象,但没有类名时,你可以使用:

$class_name = get_class($class_object);
$class_const = 'My_Constant';


$constant_value = constant($class_name.'::'.$class_const);

我知道我迟到了,但我希望这个能帮上忙。

根据 菲尔的答案,我创建了一个可以扩展的默认枚举器类。

class DefaultEnum
{
static public function getConstantText(string $constant)
{
try {
// Get child class name that called this method
$child_class = get_called_class();


$reflection = new ReflectionClass($child_class);
$const = $reflection->getConstant($constant);


return $const;
} catch (\ReflectionException $e) {
// ...
}
}
}


class CustomEnum extends DefaultEnum
{
const something = 'abcd';
const something2 = 'ABCD';
}

您可以像这样调用此方法

CustomEnum::getConstantText('something');

它将返回 'abcd'

函数 get_called_class()是一个返回调用此方法的类名的函数,它专门用于静态方法。

在这种情况下,$child_class值将是 CustomEnum::class.RefectionClass 接受字符串和对象作为参数。